Python ThreadPoolExecutor抑制异常

时间:2019-05-10 10:11:01

标签: python exception

from concurrent.futures import ThreadPoolExecutor, wait, ALL_COMPLETED


def div_zero(x):
    print('In div_zero')
    return x / 0


with ThreadPoolExecutor(max_workers=4) as executor:
    futures = executor.submit(div_zero, 1)

    done, _ = wait([futures], return_when=ALL_COMPLETED)
    # print(done.pop().result())

    print('Done')

上面的程序将完全运行,没有任何错误消息。

仅当您显式调用future.result()future.exception()时(如我在注释行中所做的那样),您才能获得异常。

我想知道为什么这个Python模块即使隐藏了问题也选择了这种行为。因此,我花了数小时进行调试 程序错误(在类中引用了不存在的属性),如果程序因异常而崩溃(例如Java),该错误将非常明显。

2 个答案:

答案 0 :(得分:5)

我怀疑原因是因为一个线程引发异常,所以整个池不会崩溃。这样,池将处理所有任务,并且您可以根据需要单独获取引发异常的线程。

答案 1 :(得分:1)

每个线程(大部分)与其他线程(包括主线程)隔离。主线程不会与其他线程进行通信,直到您要求这样做为止。

这包括错误。结果就是您所看到的,其他线程发生的错误不会干扰主线程。您只需要在要求结果时处理它们即可。