Python 3.2 就已經引入了 concurrent.futures 模塊,提供了線程池(ThreadPoolExecutor)和進程池(ProcessPoolExecutor),用于簡化并發編程的管理和調度。
ThreadPoolExecutor
在ThreadPoolExecutor
是 concurrent.futures
模塊提供的類,用于管理和調度線程池。
它的主要作用是:
????????線程管理: 管理多個線程,使得可以并發執行多個任務。
????????任務提交和執行: 可以通過 submit()
方法提交任務(即可調用對象),線程池會自動分配線程來執行任務。
????????結果獲取: 可以通過 Future
對象獲取任務的執行結果或狀態,支持阻塞和非阻塞方式獲取結果。
????????資源控制: 可以控制線程池的大小,包括最大線程數、空閑線程的存活時間等,以優化資源利用和性能。
使用 ThreadPoolExecutor
可以方便地管理大量的并發任務,特別適合于 I/O 密集型任務,網絡請求、文件操作等,因為 Python 的全局解釋器鎖(GIL)會影響多線程并行執行 CPU 密集型任務的效率。
GIL 的作用和機制
鎖的作用: GIL 是一個互斥鎖,它的存在保證了任何時候只有一個線程在解釋器中執行 Python 字節碼。這意味著在多線程環境下,Python 解釋器無法實現真正的并行執行多個線程。即使在多核 CPU 上,Python 解釋器也只能讓一個線程執行,其他線程會被阻塞。
影響: GIL 的存在對 CPU 密集型任務有較大影響,因為只有一個線程能夠利用 CPU 資源。但對于 I/O 密集型任務,由于大部分時間線程都在等待外部 I/O 操作完成,GIL 的影響較小,可以通過多線程有效提升并發性能。
適用場景: Python 的 GIL 限制對于多線程并發執行 CPU 密集型任務的效率,因此對于 CPU 密集型任務,建議考慮使用多進程或者其它方式避開 GIL 的影響。
ProcessPoolExecutor
ProcessPoolExecutor
與 ThreadPoolExecutor
類似,但是它管理的是進程池而不是線程池。
主要特點包括:
????????進程管理: 管理多個進程,每個進程都有自己獨立的 Python 解釋器和 GIL,因此能夠更好地利用多核 CPU。
????????任務提交和執行: 提交任務與 ThreadPoolExecutor
類似,可以通過 submit()
方法提交可調用對象(如函數),進程池會自動分配進程來執行任務。
????????結果獲取: 同樣可以通過 Future
對象獲取任務的執行結果或狀態。
????????獨立內存空間: 每個進程擁有獨立的內存空間,不會像線程那樣共享內存,因此更安全,但也需要更多的系統資源。
ProcessPoolExecutor
適合于 CPU 密集型任務,如數值計算、圖像處理等,能夠充分利用多核處理器的優勢。