在乙個池子裡,放固定數量的執行緒,這些執行緒等待任務,一旦有任務來,就有執行緒自發的去執行任務。
concurrent.futures 這個模組是非同步呼叫的機制
concurrent.futures 提交任務都是用submit
for + submit 多個任務的提交
shutdown 是等效於pool中的close + join ,是不允許再繼續向池中增加任務,然後讓父程序(執行緒)等待池中所有程序執行完所有任務。
如何把多個任務扔進池中?
要麼使用 for+ submit 的方式去提交多個任務
要麼直接使用map(func,iterable)方式去提交多個任務
from concurrent.futures importthreadpoolexecutor
import
time
deffunc(num):
sum =0
for i in
range(num):
sum += i **2
(sum)
t = threadpoolexecutor(20)
start =time.time()
t.map(func, range(1000))
t.shutdown()
print(time.time() - start)
不同的方式提交多個任務(for + submit 或者map), 擁有不同的拿結果的方式
如果是for + submit 的方式提交任務,拿結果用result方法
如果是用map的方式提交任務,結果是乙個生成器,採用__next__()的方式去拿結果
from concurrent.futures importthreadpoolexecutor
deffunc(num):
sum =0
for i in
range(num):
sum += i **2
return
sumt = threadpoolexecutor(20)
res = t.map(func, range(100))
t.shutdown()
while 1:
try:
print(res.__next__
())
except
: stopiteration
關於**函式,不管是pool程序池的方式,還是processpoolexecutor的方式開啟程序池,
**函式都是由父程序呼叫
關於**函式,threadpoolexecutor
**函式是由父程序呼叫
Linux網路程式設計 執行緒池架構
任務佇列的任務會交給執行緒池的執行緒來處理。這當中主要運用到的是訊號量和條件變數來實現執行緒的阻塞和接任務。下面我分成了三部分 伺服器 任務佇列 客戶端 執行緒池。當任務佇列不為空,且沒有滿的時候 當任務佇列的任務超出以建好執行緒數量時 再建立出多個執行緒。下面是 書寫時候的主要流程,和具體的操作 ...
Linux 網路程式設計 9 執行緒池
任務佇列 que t 條件變數 pthread cond t 互斥鎖 pthread mutex t 啟動狀態startflag 執行緒id 執行緒數量 1.主線程 初始化執行緒池init 啟動執行緒池 tcpinit,監聽埠,等待客戶端連線,客戶端連線後,得到newfd,建立佇列的節點,儲存new...
執行緒池網路模型
兩種方法吧,一種是leader follower模型,一種是half sync half async模型。leader follower設定乙個queue,io thread向queue中push,worker thread從queue中pop。pop中,如果沒有item,就pthread cond...