如何在装饰器中使用Python并发期货

时间:2019-10-18 16:09:02

标签: python python-3.x concurrent.futures

我正在为线程池执行程序使用装饰器:

from functools import wraps
from .bounded_pool_executor import BoundedThreadPoolExecutor

_DEFAULT_POOL = BoundedThreadPoolExecutor(max_workers=5)

def threadpool(f, executor=None):
    @wraps(f)
    def wrap(*args, **kwargs):
        return (executor or _DEFAULT_POOL).submit(f, *args, **kwargs)

其中BoundedThreadPoolExecutor被定义为here

当我尝试在以@threadpool装饰的函数中使用并发期货,然后像这样用as_completed等待所有期货时

def get_results_as_completed(futures):
    # finished, pending = wait(futures, return_when=ALL_COMPLETED)
    futures_results = as_completed(futures)
    for f in futures_results:
        try:
            yield f.result()
        except:
            pass

对于某些定义如下的工人

from thread_support import threadpool
from time import sleep
from random import randint

@threadpool
def my_worker:
     res = {}
     # do something
     sleep(randint(1, 5))
     return res

if __name__ == "__main__":
   futures_results = get_results_as_completed(futures)
       for r in futures_results:
           results.append(r)

尽管有.result()调用,但我无法完成期货,因此导致futures_results无限循环。为什么?

0 个答案:

没有答案