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),该错误将非常明显。
答案 0 :(得分:5)
我怀疑原因是因为一个线程引发异常,所以整个池不会崩溃。这样,池将处理所有任务,并且您可以根据需要单独获取引发异常的线程。
答案 1 :(得分:1)
每个线程(大部分)与其他线程(包括主线程)隔离。主线程不会与其他线程进行通信,直到您要求这样做为止。
这包括错误。结果就是您所看到的,其他线程发生的错误不会干扰主线程。您只需要在要求结果时处理它们即可。