Python 在concurrent.futures中检测失败的任务

Python 在concurrent.futures中检测失败的任务,python,multithreading,multiprocessing,python-multithreading,concurrent.futures,Python,Multithreading,Multiprocessing,Python Multithreading,Concurrent.futures,我一直在使用concurrent.futures,因为它有一个简单的界面,可以让用户轻松控制线程/进程的最大数量。但是,concurrent.futures似乎隐藏失败的任务,并在所有任务完成/失败后继续主线程 import concurrent.futures def f(i): return (i + 's') with concurrent.futures.ThreadPoolExecutor(max_workers=10) as executor: fs = [exe

我一直在使用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都会导致类型错误。但是,整个脚本运行正常,退出时代码为0。有没有办法让它在任何线程失败时抛出异常/错误


或者,有没有更好的方法在不使用concurrent.futures的情况下限制线程/进程的数量?

还有另一种方法可以对multiprocessing.Pool(用于进程)或multiprocessing.Pool.ThreadPool(用于线程)执行相同的操作。据我所知,它会重新捕获任何捕获到的异常。

concurrent.futures.wait
将确保所有任务都已完成,但它不会检查成功(返回)与失败(在worker函数中引发异常且未捕获异常)之间的关系。为此,您需要调用每个
Future
(这将导致它重新引发任务中的异常,或者生成
返回值)。还有其他方法可以在不在主线程中实际引发的情况下进行检查(例如
.exception()
),但是
.result()
是最简单的方法

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

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

它将在
未来
完成时处理结果,并在出现异常时立即
提出
异常
。或者,您继续使用
等待
,以便在检查任何异常之前完成所有任务,然后直接迭代
fs
,并在每个任务上调用
.result()

这个问题是关于
并发的。futures
这是多处理模块的更现代的实现。对我来说,建议使用旧库毫无意义。@guettli,这个旧库仍然被许多并行库(例如Joblib和Dask)积极使用。futures在功能上并不等同于Pool的
map
功能,这可能比等待多个未来对象更有效。是的,许多库都在积极使用多处理。但是这个问题的标题是:“在并发.futures中检测失败的任务”是的。但这是否意味着我们不能提出OP思考方式的任何替代方案?有时候,除了转向别的东西,没有别的办法来回答这个问题。AFAIK concurrent.futures更现代。我知道多重处理并没有被弃用,但我不建议回去。当然,有时重定向到其他内容非常有用。相关: