我正在为线程池执行程序使用装饰器:
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无限循环。为什么?