多線程的應(yīng)用場景
要解決這個問題,首先要分析以下兩個問題:
1 為什么要使用多線程?
使用多線程,本質(zhì)上就是提升程序性能,最核心的就是降低延遲和提升吞吐量。
2 多線程的應(yīng)用場景
在并發(fā)編程領(lǐng)域,提升性能本質(zhì)上就是提升硬件的利用率,再具體點(diǎn)來說,就是提升 I/O 的利用率和 CPU 的利用率。
創(chuàng)建多少線程合適?
創(chuàng)建多少線程合適,要看多線程具體的應(yīng)用場景。I/O 密集型程序和 CPU 密集型程序,計算最佳線程數(shù)的方法是不同的。
CPU 密集型計算
對于 CPU 密集型計算,多線程本質(zhì)上是提升多核 CPU 的利用率,所以對于一個 4 核的 CPU,每個核一個線程,理論上創(chuàng)建 4 個線程就可以了,再多創(chuàng)建線程也只是增加線程切 換的成本。所以,對于 CPU 密集型的計算場景,理論上“線程的數(shù)量 =CPU * 核數(shù)”就是最合適的。不過在工程上,線程的數(shù)量一般會設(shè)置為“CPU 核數(shù) +1”,這樣的話,當(dāng)線 程因為偶爾的內(nèi)存頁失效或其他原因?qū)е伦枞麜r,這個額外的線程可以頂上,從而保證 CPU 的利用率。
CPU 密集型計算
最佳線程數(shù) =CPU 核數(shù) * [ 1 +(I/O 耗時 / CPU 耗時)]
對于 I/O 密集型計算場景,I/O 耗時和 CPU 耗時的比值是一個關(guān)鍵參數(shù),不幸的是這個參數(shù)是未知的,而且是動態(tài)變化的,所以工程上,我們要估算這個參數(shù),然后做各種不同場景 下的壓測來驗證我們的估計。不過工程上,原則還是將硬件的性能發(fā)揮到極致,所以壓測時,我們需要重點(diǎn)關(guān)注 CPU、I/O 設(shè)備的利用率和性能指標(biāo)(響應(yīng)時間、吞吐量)之間的 關(guān)系。