古詩詞大全網 - 古詩大全 - Python ThreadPoolExecutor 異常中止解決方案

Python ThreadPoolExecutor 異常中止解決方案

通常情況,我們利用 Ctrl+C 讓程序觸發 KeyboardInterrupt 異常,中止程序運行。線程池方案下, Ctrl-C 失效,當線程池裏的線程任務跑完後,才會觸發 KeyboardInterrupt

上下文管理協議相當於隱性地省略了 threadPool.shutdown(wait=True) ,同時,程序正常執行完成或出現異常中斷的時候,就會調用 __exit__() 方法,接下來進行異常中止的基礎。

適用於 Django 等 WEB 應用框架,本身自帶多線程,修改全局變量簡單,但要註意線程安全。

程序運行中,只需 sign = 1 或者 exiting.set() ,worker 函數則跳過主要運算部分,剩余線程任務將迅速完成,變相達到中止多線程任務的目的。

提交給線程池的每個線程任務 task 加入 threadPool 中,方便後續對 task 進行操作。當 for 循環內的 task 全部提交後,線程會再後臺運行,而進程運行至 while 中堵塞,直至 threadPool 中最後壹個線程是否 .done() 。若進程堵塞在 while 中接收到 Ctrl+C KeyboardInterrupt 異常,則從後往前取消 threadPool 中所有任務,達到中止目的。