我一直在使用concurrent.futures,因为它有一个简单的界面,可以让用户轻松地控制最大线程/进程的数量。但是,concurrent.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退出。当任何线程失败时,是否有任何方法使它抛出异常/错误?
或者,是否有更好的方法来限制线程/进程的数量而不使用concurrent.futures?
发布于 2016-02-29 18:50:42
concurrent.futures.wait
将确保所有任务都完成,但它不检查成功( return
-ed)和失败(异常引发,而没有在worker函数中捕获)。要做到这一点,您需要对每个Future
调用Future
(这将导致它重新raise
任务中的异常,或者生成return
-ed值)。在主线程中有其他方法要检查,而不实际引发(例如,.exception()
),但是.result()
是最简单的方法。
如果您想使其成为re-raise
,最简单的方法就是将wait()
调用替换为:
for fut in concurrent.futures.as_completed(fs):
fut.result()
它将在Future
完成时处理结果,并在发生Exception
时立即执行Exception
。或者,您继续使用wait
,以便在检查其中任何一个任务的异常之前完成所有任务,然后直接在fs
上迭代并在每个任务上调用.result()
。
发布于 2016-02-29 18:41:28
对于multiprocessing.Pool (用于进程)或multiprocessing.pool.ThreadPool (用于线程),还有另一种方法。据我所知,它会引发任何被捕获的异常。
https://stackoverflow.com/questions/35711160
复制相似问题