检测concurrent.futures中的失败任务

时间:2016-02-29 22:38:47

标签: 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 = [executor.submit(f, i ) for i in range(10)]
    concurrent.futures.wait(fs)

对任何整数调用f会导致TypeError。但是,整个脚本运行得很好,并以代码0退出。有没有办法让它在任何线程失败时抛出异常/错误?

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

2 个答案:

答案 0 :(得分:8)

concurrent.futures.wait将确保完成所有任务,但它不会检查成功(return - ed)与失败(异常引发且未在工作人员函数中捕获)。为此,您需要在每个Future上调用.result()(这将导致它重新raise任务中的异常,或生成return - ed值)。还有其他方法可以检查而不实际提升主线程(例如.exception()),但.result()是最直接的方法。

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

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

会在Future完成时处理结果,如果发生raise,则会Exception wait。或者,您继续使用fs,以便在检查其中任何一项的例外之前完成所有任务,然后直接迭代.result()并在每个任务上调用<?php $font = "files/fonts/open_sans/OpenSans-Regular-webfont.ttf"; $image = imagecreatefrompng('images/icons/marker_icon.png'); $white = ImageColorAllocate($image, 255,255,255); imagettftext($image, 15, 0, 10, 35, $white, $font, $_GET['count']); header("content-type: image/png"); imagepng($image); imagedestroy($image); ?>

答案 1 :(得分:0)

还有另一种方法可以使用multiprocessing.Pool(用于进程)或multiprocessing.pool.ThreadPool(用于线程)。据我所知,它重新抛出任何被捕获的异常。