我同時使用concurrent.futures. 所有這些都是成功運行代碼中的后續步驟成功所必需的。
雖然在所有行程結束時我可以通過運行引發任何例外.result(),但理想情況下,在單個執行緒中引發的任何例外都會立即停止所有執行緒。這將有助于更快地識別任何任務中的錯誤,而不是等到所有長時間運行的行程完成。
這可能嗎?
uj5u.com熱心網友回復:
在第一個例外之后退出并且不向 Executor 提交任何新作業是可能的。但是,一旦提交了作業,就無法取消,您必須等待所有提交的作業完成(或超時)。有關詳細資訊,請參閱此問題。這是一個簡短的示例,一旦發生第一個例外,它將取消所有未提交的作業。但是,它仍然等待已經提交的作業完成。這使用concurrent.futures 檔案"FIRST EXCEPTION"中列出的關鍵字。
import time
import concurrent.futures
def example(i):
print(i)
assert i != 1
time.sleep(i)
return i
if __name__ == "__main__":
futures = []
with concurrent.futures.ThreadPoolExecutor() as executor:
for number in range(5):
futures.append(executor.submit(example, number))
exception = False
for completed, running_or_error in concurrent.futures.wait(futures, return_when="FIRST_EXCEPTION"):
try:
running_or_error.result()
except Exception as e:
for future in futures:
print(future.cancel()) # cancel all unstarted futures
raise e
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/424582.html
上一篇:Python中信號量的使用
