1. 程式人生 > >多執行緒的那點事兒(1)--如何選擇執行緒數

多執行緒的那點事兒(1)--如何選擇執行緒數

  多執行緒向來是一個讓程式設計師頭痛的一個問題,不只是初學者容易犯錯誤,很多老鳥也難免站著中槍。一旦出現問題很難定位和解決,除了可能因為程式設計者知識上的缺陷導致的疏漏外,另一個難題就是問題重現難度大,避免多執行緒導致BUG最好的方法就是預防。

  首先,在開始進行多執行緒程式設計之前要考慮好,我們是否真的需要多執行緒,什麼時候才需要多執行緒。正所謂”大道至簡“,越簡單的設計越是好的設計,如果單個執行緒就可以完成任務解決問題,就不要用多個執行緒,不要為了炫耀一下自己的多執行緒程式設計能力動不動就起個執行緒,到最好搞不好會搬石頭砸自己的腳。那什麼情況下才需要用多執行緒呢,如果滿足以下兩個條件之一就不得使用多執行緒:
  (1)單執行緒不能滿足業務需要。例如12306的火車票售票系統,在同一時間內可能會有NNN個請求,這些請求之間是完全獨立的,其發起時間也是沒有相互依賴關係的,後臺必須使用多執行緒處理以保證對使用者響應的及時。

  (2)單執行緒不能滿足效能要求且資料IO吞吐率低於CPU的處理能力。如果單個執行緒可以滿足效能要求根據無須考慮多執行緒了,在對於訪問IO較多的應用中,IO(無論是讀寫資料還是等待使用者響應)會阻塞執行緒的執行,而CPU更多的時間處於等待外部響應的狀態,此時增加執行緒可以提高CPU的利用率,當有執行緒在等待IO的時候有別的執行緒在使用CPU,從而通過提高CPU的利用率而提高應用的整體效能。

  其次,當確定了肯定要用多執行緒之後,緊接著就得考慮一個問題:用幾個執行緒比較合適?主要可以從以下方面考慮:

  (1)業務邏輯。根據實際的業務不同要通過經驗資料來確定執行緒的數量,很難有統一的公式計算出來,要通過不斷的調整、測試、比較來確定一個比較合理的數字,而且隨著業務的變更,引數還要重新調整。

  (2)CPU數量。如果只有一個CPU,在同一時間不可能執行兩個執行緒的,它們是通過時間片的輪換來實現多執行緒的,而線上程間的不斷切換時作業系統會有進行很多的操作,相當消費CPU資源,執行緒越多無謂的CPU消費也就越多。對於一個計算密集型的任務可能只用一個執行緒才是效率最高的,例如對大塊記憶體資料的排序操作,沒有任何IO會阻塞執行緒,使用多個執行緒只會無謂地消費CPU資源,只需要一個執行緒一直進行排序操作即可。要想發揮CPU的最佳效能,無論對任何型別的應用,執行緒的最小數量就是CPU的數量,如果此時CPU還有空閒再考慮增加執行緒的數量,不斷調整以取得最佳的效能。

  (3)記憶體大小。因為每個執行緒都要分配獨立的棧以及獨立的上下文環境,所以建立一個新的執行緒之後即使什麼也不幹也會消耗一定的記憶體,故而並不是執行緒越多效能越好。因為如果建立的執行緒過多記憶體不夠用,很可能導致程式在執行過程中有虛擬記憶體的使用,將記憶體的訪問轉化為低速儲存的訪問,反而會負面影響應用的效能。

  然而,這些因素只是影響確定執行緒數的重要因素,但並沒有公式可使用,需要根據經驗對這些因素進行評估並通過試驗來確定最佳的執行緒數。