問題 - 多核並行化

  如果你的電腦是16核心的話,可以開16個 goroutine 共同計算一列數的的綜合,就會發現總的執行時間沒有明顯縮短。再去觀察 CPU 運行狀態,你會發現儘管我們有16個 CPU 核心,但在計算過程中其實只有一個 CPU 核心處於繁忙狀態,這是會讓很多 Go 語言初學者迷惑的問題。

  官方的答案是,這是當前版本的 Go 編譯器還不能很智能地去發現和利用多核的優勢。雖然確實創建了個 goroutine,並且從運行狀態看這些 goroutine 也都在並行運行,但實際上所有這些 goroutine 都運行在同一個 CPU 核心上在一個 goroutine 得到時間片執行的時候,其他 goroutine 都會處於等待狀態。從這一點可以看出,雖然 goroutine 簡化了寫並行代碼的過程,但實際上整體運行效率並不真正高於單線程程序。

  在 Go 語言升級到默認支持多 CPU 的某個版本之前,可以先通過設置環境變量 GOMAXPROCS 的值來控制使用多少個 CPU 核心。具體操作方法是通過直接設置環境變量 GOMAXPROCS 的值,或者在代碼中啓動 goroutine 之前先調用以下這個語句以設置使用16個CPU核心:

runtime.GOMAXPROCS(16)

  到底應該設置多少個 CPU 核心呢,其實 runtime 包中還提供了另外一個函數 NumCPU() 來獲取核心數。可以看到,Go 語言其實已經感知到所有的環境信息,下一版本中完全可以利用這些信息將 goroutine 調度到所有 CPU 核心上,從而最大化地利用服務器的多核計算能力。拋棄 GOMAXPROCS 只是個時間問題。

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