Python parallel.futures如何检测失败的任务?

我一直在使用parallel.futures,因为它具有简单的界面,并允许用户轻松控制线程/进程的最大数量。但是,似乎current.futures隐藏了失败的任务,并在所有任务完成/失败之后继续执行主线程。

import concurrent.futures

def f(i):
    return (i + 's')

with concurrent.futures.ThreadPoolExecutor(max_workers=10) as executor:
    fs = [executor.submit(f, i ) for i in range(10)]
    concurrent.futures.wait(fs)

在任何整数上调用f都会导致TypeError。但是,整个脚本运行得很好,并以代码0退出。当任何线程失败时,是否有任何方法可以使它引发异常/错误?

或者,有没有一种更好的方法来限制线程/进程的数量而无需使用current.futures?

已邀请:

chris - 喜欢自由散漫的我

concurrent.futures.wait将确保所有任务都已完成,但不会检查成功(某些事情由return编写)还是失败(引发异常且未捕获到辅助函数中)。为此,您需要在每个.result()上调用Future(这将使其重新从任务中重新生成raise异常,或产生return -ed值)。还有其他方法可以在不实际提升主线程的情况下进行检查(例如.exception()),但是.result()是最直接的方法。


如果要使其重新为raise,最简单的方法是将wait()调用替换为:


for fut in concurrent.futures.as_completed(fs):
fut.result()

它会在Future完成时处理结果,如果出现raise,则会立即Exception一个wait。或者,您继续使用fs,以便在检查任何任务的异常之前完成所有任务,然后直接遍历.result()并在每个任务上调用。

要回复问题请先登录注册