天天看點

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

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

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

為什麼會使用多線程

  • 使用多線程的主要目的我們應該都能回答的出來就是提高程式的性能,這個提高性能其實是指,降低延遲 指發送請求到接收到資料的時間,和 提搞吞吐量:機關時間能可以處理更多的請求。
  • 将近延遲和提高吞吐量對應的方法有兩種: 優化算法 和 将機器的硬體性能發揮到極緻
    • 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 防止由于其他因素導緻線程阻塞等。

結束語

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

繼續閱讀