合理配置線程池數量


CPU密集、IO密集。

CPU密集該任務(run代碼)需要大量的運算,而沒有阻塞的情況,CPU全速運行。

CPU密集

CPU密集的意思是該任務需要大量的運算,而沒有阻塞,CPU一直全速運行。

CPU密集任務只有在真正的多核CPU上才可能得到加速(通過多線程),而在單核CPU上,無論你開幾個模擬的多線程,該任務都不可能得到加速,因為CPU總的運算能力就那些。

IO密集

IO密集型,即該任務需要大量的IO,即大量的阻塞。在單線程上運行IO密集型的任務會導致浪費大量的CPU運算能力浪費在等待。所以在IO密集型任務中使用多線程可以大大的加速程序運行,即時在單核CPU上,這種加速主要就是利用了被浪費掉的阻塞時間。

 

接着上一篇探討線程池留下的尾巴,如何合理的設置線程池大小。

要想合理的配置線程池的大小,首先得分析任務的特性,可以從以下幾個角度分析:

1. 任務的性質:CPU密集型任務、IO密集型任務、混合型任務。

2. 任務的優先級:高、中、低。

3. 任務的執行時間:長、中、短。

4. 任務的依賴性:是否依賴其他系統資源,如數據庫連接等。

性質不同的任務可以交給不同規模的線程池執行。

對於不同性質的任務來說,CPU密集型任務應配置盡可能小的線程,如配置CPU個數+1的線程數,IO密集型任務應配置盡可能多的線程,因為IO操作不占用CPU,不要讓CPU閑下來,應加大線程數量,如配置兩倍CPU個數+1,而對於混合型的任務,如果可以拆分,拆分成IO密集型和CPU密集型分別處理,前提是兩者運行的時間是差不多的,如果處理時間相差很大,則沒必要拆分了。

若任務對其他系統資源有依賴,如某個任務依賴數據庫的連接返回的結果,這時候等待的時間越長,則CPU空閑的時間越長,那么線程數量應設置得越大,才能更好的利用CPU。

當然具體合理線程池值大小,需要結合系統實際情況,在大量的嘗試下比較才能得出,以上只是前人總結的規律。

 

最佳線程數目 = ((線程等待時間+線程CPU時間)/線程CPU時間 )* CPU數目

比如平均每個線程CPU運行時間為0.5s,而線程等待時間(非CPU運行時間,比如IO)為1.5s,CPU核心數為8,那么根據上面這個公式估算得到:((0.5+1.5)/0.5)*8=32。這個公式進一步轉化為:

最佳線程數目 = (線程等待時間與線程CPU時間之比 + 1)* CPU數目

可以得出一個結論: 
線程等待時間所占比例越高,需要越多線程。線程CPU時間所占比例越高,需要越少線程。 
以上公式與之前的CPU和IO密集型任務設置線程數基本吻合。

 

CPU密集型時,任務可以少配置線程數,大概和機器的cpu核數相當,這樣可以使得每個線程都在執行任務

IO密集型時,大部分線程都阻塞,故需要多配置線程數,2*cpu核數

操作系統之名稱解釋:

某些進程花費了絕大多數時間在計算上,而其他則在等待I/O上花費了大多是時間,

前者稱為計算密集型(CPU密集型)computer-bound,后者稱為I/O密集型,I/O-bound。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM