合理配置執行緒池
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。
相關文章
- 如何合理地估算執行緒池大小?(轉載)執行緒
- Spring 非同步執行緒池、排程任務執行緒池配置Spring非同步執行緒
- 根據CPU核數合理設定執行緒池大小執行緒
- Java執行緒池二:執行緒池原理Java執行緒
- 淺談執行緒池(上):執行緒池的作用及CLR執行緒池執行緒
- 執行緒和執行緒池執行緒
- 多執行緒【執行緒池】執行緒
- 執行緒 執行緒池 Task執行緒
- 執行緒池執行緒
- 淺談執行緒池(中):獨立執行緒池的作用及IO執行緒池執行緒
- Java多執行緒——執行緒池Java執行緒
- java執行緒池趣味事:這不是執行緒池Java執行緒
- 執行緒池以及四種常見執行緒池執行緒
- springboot配置執行緒池使用多執行緒插入資料Spring Boot執行緒
- java--執行緒池--建立執行緒池的幾種方式與執行緒池操作詳解Java執行緒
- java多執行緒9:執行緒池Java執行緒
- 二. 執行緒管理之執行緒池執行緒
- kuangshenshuo-多執行緒-執行緒池執行緒
- 執行緒的建立及執行緒池執行緒
- JavaThread多執行緒執行緒池Javathread執行緒
- Java多執行緒18:執行緒池Java執行緒
- 多執行緒之手撕執行緒池執行緒
- 執行緒池管理(1)-為什麼需要執行緒池執行緒
- 執行緒數,512是否合理?執行緒
- 執行緒與執行緒池的那些事之執行緒池篇(萬字長文)執行緒
- 執行緒池 Executor執行緒
- Java執行緒池Java執行緒
- java 執行緒池Java執行緒
- 再聊執行緒池執行緒
- 執行緒池原理執行緒
- Ruby執行緒池執行緒
- Android多執行緒之執行緒池Android執行緒
- Java多執行緒-執行緒池的使用Java執行緒
- 執行緒池建立執行緒的過程執行緒
- Java執行緒池一:執行緒基礎Java執行緒
- Android的執行緒和執行緒池Android執行緒
- 【Java】【多執行緒】執行緒池簡述Java執行緒
- java多執行緒系列之執行緒池Java執行緒