我一直在使用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?
答案 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(用于线程)。据我所知,它重新抛出任何被捕获的异常。