.Net的各種異步任務都依賴線程池,深入理解線程池更有助於我們對系統的並發控制。
參數:
-
當前工作線程數可以通過ThreadPool.ThreadCount屬性查詢。
-
線程池關鍵的是最小線程數,可以通過ThreadPool.GetMinThreads()函數獲取,里面有兩個指標參數,工作線程數和io線程數。
-
默認最小線程數是邏輯CPU個數,可以通過ThreadPool.SetMinThreads()函數修改這個值。
管理策略:
最小線程數不是一開始就投放到線程池,也是逐步創建的,以工作線程為例:
-
當工作線程數未達到最小線程限制時,新任務后會立即創建線程。
-
當工作線程數達到最小線程限制時,新任務依然會創建線程,但不是立即,而是每秒鍾不超過2個(應該是為了防止任務洪峰造成的創建線程的開銷,盡量使用線程池現有線程),沒來得及執行的任務會排隊。
-
當所有任務都完成,線程池中的線程會逐步釋放掉。
實踐:
如果系統本身有一大堆依賴着線程池的后台任務時,默認的最小線程池就不大夠了。默認的最小線程閾值是cpu個數,是很容易被消耗光的。此時再來耗時的新任務時,由於超過最小線程數的閾值,新的請求的創建線程數不超過每秒2個,很容易導致得不到線程池的調度而排隊。 此時可能需要合理修改最小線程池大小。
相關文章: