我想创建一个在ThreadPoolExecutor上运行的future列表,然后在它们完成评估后立即显示每个future。
预期结果为:每3秒打印0、2、6、12中的每一个。
然而,我在12秒后才得到结果,数字同时显示。
from concurrent.futures import ThreadPoolExecutor
import time
def fnc(x, y):
time.sleep(3)
return x*y
futures = []
with ThreadPoolExecutor(max_workers=1) as executor:
for i in range(0, 4):
print(f"Submitting {i}")
futures += [executor.submit(fnc, i, i+1)]
for f in futures:
print(f.result())
2条答案
按热度按时间cclgggtu1#
构建已提交future的列表,然后使用 as_completed() 来了解线程何时完成,其结果何时可用。
xkftehaa2#
你在
ThreadPoolExecutor
上下文管理器外调用result
方法,当你退出时,它调用__exit__
方法:shutdown
方法签名为:医生说:
我们可以看到,默认情况下,它会等到所有正在运行的future和它们的资源都停止运行,并且
cancel_futures
默认情况下会得到值False
,因此我们不是取消挂起的future。我们可以通过修改
fnc
来打印值而不是返回值,并且在ThreadPoolExecutor
上下文管理器代码块之后什么也不做来证明这一点:仍然打印值
0, 2, 6, 12
!,即使我们只将函数提交到执行列表...通过在上下文管理器中移动
for
循环块来修复它:请注意,设置
max_workers=1
本质上是强制程序连续运行而不是并发运行,在此程序中,设置max_workers=X
将一次打印fnc
的X
返回结果。如果你想在两个结果之间等待3秒钟,那么可以将
max_workers
设置为1或者完全删除它。如果你想每3秒钟打印两个结果-设置max_workers=2
等等。