線程池創建多少線程比較合理?


原文:https://www.cnblogs.com/karlMa/p/11356041.html

  在設置線程池線程個數的時候,經常會想到這個問題,是不是設置的線程數越多越好?理解這個問題之前我們要先清楚的知道我們為什么使用多線程。

 

為什么會使用多線程

  使用多線程的主要目的我們應該都能回答的出來,就是提高程序的性能,這個提高性能其實是指,“降低延遲”:指發送請求到接收到數據的時間,和“提搞吞吐量”:單位時間能可以處理更多的請求。

  將近延遲和提高吞吐量對應的方法有兩種: 優化算法 和 將機器的硬件性能發揮到極致。

  1. 優化算法:降低時間和空間復雜度,使的程序執行時間更短。

  2. 將硬件的性能發揮到極致,具體的指提高I/O 和cpu的利用率。

  如何提高I/O 和CPU的利用率的舉例: 如果單核系統中,只有一個程序執行又有IO操作和CPU計算的代碼,當程序執行IO操作的時候,CPU其實是空閑的,反之IO是空閑的,如果這個時候用兩個線程去跑這段代碼,一個線程執行IO操作 ,一個線程執行CPU計算 ,這時IO和CPU的利用率是不是發揮了極致?

 

創建多少線程比較合適?

  經過上面的分析,我們知道創建多少線程能夠將硬件的利用率達到最高才是最好的線程數。

  我們從線程的應用場景來分析, 由於IO操作比CPU計算耗時要久的多的,如果我們一段程序有IO操作和CPU計算 我們可以稱之為:IO密集型計算。 程序中沒有IO操作,只有CPU的話,稱之為CPU密集型程序。

  1. IO密集計算,如何將硬件利用率達到極致呢 我們將 R = IO耗時 / CPU耗時 我們從上面的例子來看 如果IO耗時/CPU耗時 = 10 (我們平常可以用工具apm來統計這個比例) 創建線程A 執行io操作 我們希望IO操作的時候 CPU不能閑着 所以就應該創建10個線程去執行CPU計算 當Io操作完畢后剛好CPU也執行完畢 ,他們的利用率都是百分之100 在執行這段代碼的時候。這個例子我們要創建 1+ 10 = 11個線程執行起來效率更高,於是我們就得到了公式: 1+ I/O耗時/CPU耗時,如果是多核CPU最佳線程數 =CPU 核數 * [ 1 +(I/O 耗時 / CPU耗時)

  2. CPU密集型,這個就很簡單了 CPU的核數 = 線程數就行,一般我們會設置 CPU核數+1 防止由於其他因素導致線程阻塞等。


免責聲明!

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



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