我正在使用ThreadPoolExecutor
,並且需要在任何工作線程失敗的情況下中止整個計算。如何立即重新引發任何工作線程中引發的異常?
例1這將打印成功不管錯誤的,因爲ThreadPoolExecutor
不會自動重新拋出異常。
from concurrent.futures import ThreadPoolExecutor
def task():
raise ValueError
with ThreadPoolExecutor() as executor:
executor.submit(task)
print('Success')
例2這正確地崩潰主線程因爲.result()
重新引發的異常。但它等待第一個任務完成,所以主線程會延遲處理異常。
import time
from concurrent.futures import ThreadPoolExecutor
def task(should_raise):
time.sleep(1)
if should_raise:
raise ValueError
with ThreadPoolExecutor() as executor:
executor.submit(task, False).result()
executor.submit(task, True).result()
print('Success')
如何,我注意到在主線程(或多或少)後立即發生,處理故障並中止其餘工人工人例外?