多線程使用:線程數的設置--CPU密集型和IO密集型

        在我們平時的編碼過程中,有時候會想到用多線程來提升程序的性能,那麼什麼時候用多線程,多線程的線程數應該設置爲多少比較好,這個就需要根據具體的需求來設置,這裏,主要分爲CPU密集型和IO密集型的任務。先來介紹以下概念

 

CPU密集型

       CPU密集型會消耗掉大量的CPU資源,例如需要大量的計算,一些複雜運算,邏輯處理之類的。這個時候CPU就卯足了勁在運行,這個時候切換線程,反而浪費了切換的時間,效率不高。

       就像你的大腦是CPU,你本來就在一本心思地寫作業,多線程這時候就是要你寫會作業,然後立刻敲一會代碼,然後在P個圖,然後在看個視頻,然後再切換回作業。emmmm,過程中你還需要切換(收起來作業,拿出電腦,打開VS…)那你的作業怕是要寫到掛科。。。這個時候不太適合使用多線程,你就該一門心思地寫作業~

IO密集型

    涉及到網絡、磁盤IO的都是IO密集型,這個時候CPU利用率並不高,這個時候適合使用多線程。

    同樣以你的大腦爲例,IO密集型就是“不燒腦”的工作。例如你需要陪小姐姐或者小哥哥聊天,還需要下載一個VS,還需要看我(黑哥)的博客。這個時候如果使用多線程的話會怎麼做?

     咦?小哥哥(小姐姐)給你發消息了,回一下TA,然後呢?TA給你回消息肯定需要時間,這個時候你就可以搜索VS的網站,先下安裝包,然後一看,哎呦,TA還沒給你回消息,然後看會你黑哥的博客。小哥哥(小姐姐)終於回你了,你回一下TA,接着看我的博客,這就是類似於IO密集型。你可以在不同的“不燒腦”的工作之間切換,來達到更高的效率。而不是小姐姐不回我的信息,我就乾等,啥都不幹,就等,這個效率可想而知,也許,小姐姐(小哥哥)根本就不會回覆你~

多線程的使用和線程數的設置

      開發中我們經常會使用到線程池來處理一些業務,而在不新增設備的情況下,我們所能使用的線程資源又不是無線的,那麼高併發、任務執行時間短的業務怎樣使用線程池?還有併發不高、任務執行時間長的業務怎樣使用線程池?併發高、業務執行時間長的業務怎樣使用線程池?

接下來我們進行一一分析:

1:高併發、任務執行時間短的業務,CPU密集型的,線程池線程數可以設置爲CPU核數+1,減少線程上下文的切換

2:併發不高、任務執行時間長的業務這就需要區分開看了:

a)假如是業務時間長集中在IO操作上,也就是IO密集型的任務,因爲IO操作並不佔用CPU,所以不要讓所有的CPU閒下來,可以適當加大線程池中的線程數目,讓CPU處理更多的業務

b)假如是業務時間長集中在計算操作上,也就是計算密集型任務,這個就沒辦法了,和(1)一樣吧,線程池中的線程數設置得少一些,減少線程上下文的切換

(其實從一二可以看出無論併發高不高,對於業務中是否是cou密集還是I/O密集的判斷都是需要的當前前提是你需要優化性能的前提下)

3:併發高、業務執行時間長,解決這種類型任務的關鍵不在於線程池而在於整體架構的設計,可以引入三方中間件進行異步操作。
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章