CPU密集型
每一個CPU核心都參與計算,將CPU的性能充分利用起來,這樣才算是沒有浪費服務器配置汗洒,如果在非常好的服務器配置上還運行著單線程程序那將是多么重大的浪費挖滤。對于計算密集型的應用崩溪,完全是靠CPU的核數來工作,所以為了讓它的優(yōu)勢完全發(fā)揮出來斩松,避免過多的線程上下文切換伶唯,比較理想方案是:
線程數= CPU核數
IO密集型
對于IO密集型的應用,就很好理解了惧盹,我們現在做的開發(fā)大部分都是WEB應用乳幸,涉及到大量的網絡傳輸,不僅如此钧椰,與數據庫粹断,與緩存間的交互也涉及到IO,一旦發(fā)生IO嫡霞,線程就會處于等待狀態(tài)瓶埋,當IO結束,數據準備好后秒际,線程才會繼續(xù)執(zhí)行悬赏。因此從這里可以發(fā)現,對于IO密集型的應用娄徊,我們可以多設置一些線程池中線程的數量闽颇,這樣就能讓在等待的這段時間內,線程可以去做其它事寄锐,提高并發(fā)處理效率兵多。
那么這個線程池的數據量是不是可以隨便設置呢?當然不是的橄仆,請一定要記得剩膘,線程上下文切換是有代價的。目前總結了一套公式盆顾,對于IO密集型應用:
線程數= CPU核心數/(1-阻塞系數)
阻塞系數:?阻塞系數越高表明在準備數據的時間越長(阻塞時間長)怠褐。
即阻塞系數 = 阻塞時間 /(阻塞時間 + 計算時間) 如總時間 10? ? 阻塞9 計算1 及阻塞系數=9/(9+1)=0.9
一般情況下線程數 計算型=Ncpu+1? ? ? ?IO型=2Ncpu