子类化未来类

2024-10-02 06:30:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我想将concurrentPython模块的Future类作为子类。在

文件:

The Future class encapsulates the asynchronous execution of a callable. Future instances are created by Executor.submit().

Executor的文档没有解释它从何处获取Future类。在

。。。怎样才能使执行人.提交()强迫我参加我的未来课程?在

为什么我需要它?在

我喜欢OOP,因为它可以创建可读的代码。我希望结果如下:

for my_future in concurrent.futures.as_completed(...):
    my_future.my_custom_method()

Tags: 模块文件ofthemyfuture子类asynchronous
2条回答

查看代码ProcessPoolExecutor.submit()ThreadPollExecutor.submit()Excutor.submit()返回一个Future实例,它在^{}中定义。在

所以,诀窍来了。您可以子类化并替换原来的Future,然后在子类中添加自定义方法。在

这是可行的,但不推荐。为此,最好使用组合而不是继承。在Learn Python the Hard Way中有一个关于继承和组合的好章节

回到问题上来,下面是一个作文示例: 在

class Myclass(object):
    def __init__(self, workers=3):
         self.executor = concurrent.futures.ProcessPoolExcutor(workers)

    def run(self, job):
        '''Job to be run in a Executor'''

    def submit(self, jobs):
        self.futures = [executor.submit(self, foo, job) for job in jobs]

    def done(self, result):
        '''Dealing with the result'''

    def harvest(self):
        for my_future in concurrent.futures.as_completed(self.futures):
            self.done(my_future.result())

然后您可以将MyClass子类化并实现不同的done方法。在

Future具体类的使用被硬连接到Executor.submit()(无论是针对processes还是{a2})。因此,我认为不可能完全按照你的要求去做。但是,您可以从传递给Executor.submit()的可调用文件返回任何结果。因此,请将自定义方法放在自定义返回类中:

class my_result(object):
    def my_custom_method(self):
        pass

def x():
    return my_result()

with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor:
    futures = [executor.submit(x), executor.submit(x)]
    for my_future in concurrent.futures.as_completed(futures):
        my_future.result().my_custom_method()
               # ^^^^^^^^^

编辑或者,如果真的希望内部循环干净,请将最后两行更改为:

^{pr2}$

generator expression(f.result() ... (futures))从{}获取期货的迭代器,并为您提供这些期货结果的迭代器。然后可以循环查看这些结果。在

相关问题 更多 >

    热门问题