你知道線程池創建多少線程比較合理嗎?


你知道線程池創建多少線程比較合理嗎?

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

為什麼會使用多線程

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

將近延遲和提高吞吐量對應的方法有兩種: 優化算法和機器的硬件性能發揮到極致。優化算法降低時間和空間複雜度,使的程序執行時間更短。硬件的性能發揮到極致,具體的指提高 I/O 和 cpu 的利用率,如何提高 I/O 和 cpu 的利用率的舉例:如果單核系統中只有一個程序執行又有 IO 操作和 Cpu 計算的代碼,當程序執行 IO 操作的時候,Cpu 其實是空閒的,反之 IO 是空閒的,如果這個時候用兩個線程去跑這段代碼,一個線程執行 IO 操作 ,一個線程執行 Cpu 計算 ,這時 IO 和 Cpu 的利用率是不是發揮了極致?

創建多少線程比較合適

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

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

  • 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 耗時)。
  • Cpu 密集型,這個就很簡單了,Cpu 的核數 = 線程數就行,一般我們會設置 Cpu 核數 + 1,防止由於其他因素導致線程阻塞等。

結束語

看到這裡想必大家在回答創建多個線程比較合理這個問題有了新的思路,希望能夠幫助各位小夥伴!


分享到:


相關文章: