執行緒池和程序池模組:
from concurrent.futures import threadpoolexecutor,processpoolexecutor
python2版本:threadpoolexecutor 執行緒池執行緒池:不支援
程序池:支援
python3版本:
執行緒池:支援
程序池:支援
threadpoolexecutor
是乙個executor
子類,它使用乙個執行緒池來非同步執行呼叫。
語法:
class concurrent.futures.threadpoolexecutor(max_workers=none, thread_name_prefix='')乙個
executor
子類,它使用乙個最多 max_workers 執行緒的池來非同步地執行呼叫。
如果 max_workers 是none
或未給出,它將預設為機器上的處理器數乘以5
,假設threadpoolexecutor
經常用於重疊i/o而不是cpu工作,並且工作程式的數量應該高於數量的processpoolexecutor
工人。
thread_name_prefix 引數,以允許使用者控制由池建立的工作執行緒的threading.thread名稱,以便於除錯。
processpoolexecutor 程序池
processpoolexecutor
類是乙個executor
子類,它使用程序池來非同步執行呼叫。processpoolexecutor
使用multiprocessing
模組,它允許它側面 global interpreter lock,但也意味著只有可拾取物件可以被執行和返回。
__main__
模組必須可以由worker子程序匯入。這意味著processpoolexecutor
將不在互動式直譯器中工作。(程序池必須在main中執行才生效)
從提交到processpoolexecutor
的可呼叫方呼叫executor
或future
方法將導致死鎖。
語法:
class concurrent.futures.processpoolexecutor(max_workers=none)使用最多 max_workers 程序的池非同步執行呼叫的
executor
子類。如果 max_workers 是none
或未給出,它將預設為機器上的處理器數。如果 max_workers 低於或等於0
,則將產生valueerror
。
當其中乙個工作程序突然終止時,現在會出現brokenprocesspool
錯誤。以前,行為是未定義的,但對執行器或其未來的操作通常會凍結或死鎖。
import time序列示例def task(i):
time.sleep(1)
print(i)
for row in range(100
): task(row)
# 100任務執行緒池和程序池示例import time
from
concurrent.futures import threadpoolexecutor,processpoolexecutor
def task(i):
time.sleep(1)
print(i)
p = threadpoolexecutor(10
) #有100個任務,每次只處理10個任務,其他任務等待前10個任務完成
# p = processpoolexecutor(10
) #程序池,只需要把threadpoolexecutor更改為processpoolexecutor即可。
for row in range(100
): p.submit(task,row)
執行緒池和程序池
動態建立程序 或執行緒 是比較耗費時間的,這樣導致較慢的客戶響應。動態建立的子程序 子執行緒 通常只用來為乙個客戶服務,這將導致系統上產生大量的細微程序 或執行緒 程序間的切換將消耗大量的cpu時間。動態建立的子程序是當前程序的完整映像,當前程序必須謹慎地管理其分配的檔案描述符和堆記憶體等系統資源,...
執行緒池和程序池
案例 模擬多個客戶端一同去訪問服務端,讓服務端支援多個客戶端訪問,從而實現併發效果 不考慮粘包問題 import socket from threading import thread server socket.socket def communicate conn 開始通訊 while true...
程序池和執行緒池
系統啟動乙個新執行緒的成本是比較高的,因為它涉及與作業系統的互動。在這種情形下,使用執行緒池可以很好地提公升效能,尤其是當程式中需要建立大量生存期很短暫的執行緒時,更應該考慮使用執行緒池。執行緒池在系統啟動時即建立大量空閒的執行緒,程式只要將乙個函式提交給執行緒池,執行緒池就會啟動乙個空閒的執行緒來...