目前的大多數網路伺服器,包括web伺服器、email伺服器以及資料庫伺服器等都具有乙個共同點,就是單位時間內必須處理數目巨大的連線請求,但處理時間卻相對較短。
傳統多執行緒方案中我們採用的伺服器模型則是一旦接受到請求之後,即建立乙個新的執行緒,由該執行緒執行任務。任務執行完畢後,執行緒退出,這就是是「即時建立,即時銷毀」的策略。儘管與建立程序相比,建立執行緒的時間已經大大的縮短,但是如果提交給執行緒的任務是執行時間較短,而且執行次數極其頻繁,那麼伺服器將處於不停的建立執行緒,銷毀執行緒的狀態。
我們將傳統方案中的執行緒執行過程分為三個過程:t1、t2、t3。
t1:執行緒建立時間
t2:執行緒執行時間,包括執行緒的同步等時間
t3:執行緒銷毀時間
那麼我們可以看出,執行緒本身的開銷所佔的比例為(t1+t3) / (t1+t2+t3)。如果執行緒執行的時間很短的話,這比開銷可能佔到20%-50%左右。如果任務執行時間很頻繁的話,這筆開銷將是不可忽略的。
除此之外,執行緒池能夠減少建立的執行緒個數。通常執行緒池所允許的併發執行緒是有上界的,如果同時需要併發的執行緒數超過上界,那麼一部分執行緒將會等待。而傳統方案中,如果同時請求數目為2000,那麼最壞情況下,系統可能需要產生2000個執行緒。儘管這不是乙個很大的數目,但是也有部分機器可能達不到這種要求。
因此執行緒池的出現正是著眼於減少執行緒池本身帶來的開銷。執行緒池採用預建立的技術,在應用程式啟動之後,將立即建立一定數量的執行緒(n1),放入空閒佇列中。這些執行緒都是處於阻塞(suspended)狀態,不消耗cpu,但占用較小的記憶體空間。當任務到來後,緩衝池選擇乙個空閒執行緒,把任務傳入此執行緒中執行。當n1個執行緒都在處理任務後,緩衝池自動建立一定數量的新執行緒,用於處理更多的任務。在任務執行完畢後執行緒也不退出,而是繼續保持在池中等待下一次的任務。當系統比較空閒時,大部分執行緒都一直處於暫停狀態,執行緒池自動銷毀一部分執行緒,**系統資源。
基於這種預建立技術,執行緒池將執行緒建立和銷毀本身所帶來的開銷分攤到了各個具體的任務上,執行次數越多,每個任務所分擔到的執行緒本身開銷則越小,不過我們另外可能需要考慮進去執行緒之間同步所帶來的開銷。
參考另一篇博文:
執行緒池原理及python實現
為什麼需要執行緒池 目前的大多數網路伺服器,包括web伺服器 email伺服器以及資料庫伺服器等都具有乙個共同點,就是單位時間內必須處理數目巨大的連線請求,但處理時間卻相對較短。傳統多執行緒方案中我們採用的伺服器模型則是一旦接受到請求之後,即建立乙個新的執行緒,由該執行緒執行任務。任務執行完畢後,執...
執行緒池原理及py實現
目前的大多數網路伺服器,包括web伺服器 email伺服器以及資料庫伺服器等都具有乙個共同點,就是單位時間內必須處理數目巨大的 連線請求,但處理時間卻相對較短。傳統多執行緒方案中我們採用的伺服器模型則是一旦接受到請求之後,即建立乙個新的執行緒,由該執行緒執行任務。任務執行完畢後,線 程退出,這就是是...
Linux執行緒池原理及C 實現
在多執行緒程式中如果頻繁的建立和結束乙個執行緒這樣會使系統的效能降低,這時我們可以建立乙個執行緒 池來完成這些任務執行完後讓其阻塞等待其他的任務這樣就可以提高系統的效能 乙個執行緒池要包括以下幾部分 1 執行緒池管理器 threadpool 用於建立並管理執行緒池,包括 建立執行緒池,銷毀執行緒池,...