首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在concurrent.futures中检测失败的任务

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

Stack Overflow用户
提问于 2016-02-29 22:38:46
回答 2查看 6.2K关注 0票数 13

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

代码语言:javascript
复制
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?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-03-01 02:50:42

concurrent.futures.wait将确保所有任务都完成,但它不检查成功( return-ed)和失败(异常引发,而没有在worker函数中捕获)。要做到这一点,您需要对每个Future调用Future(这将导致它重新raise任务中的异常,或者生成return-ed值)。在主线程中有其他方法要检查,而不实际引发(例如,.exception()),但是.result()是最简单的方法。

如果您想使其成为re-raise,最简单的方法就是将wait()调用替换为:

代码语言:javascript
复制
for fut in concurrent.futures.as_completed(fs):
    fut.result()

它将在Future完成时处理结果,并在发生Exception时立即执行Exception。或者,您继续使用wait,以便在检查其中任何一个任务的异常之前完成所有任务,然后直接在fs上迭代并在每个任务上调用.result()

票数 16
EN

Stack Overflow用户

发布于 2016-03-01 02:41:28

对于multiprocessing.Pool (用于进程)或multiprocessing.pool.ThreadPool (用于线程),还有另一种方法。据我所知,它会引发任何被捕获的异常。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35711160

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档