多核並行化
阿新 • • 發佈:2019-01-23
如果你的電腦是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 只是個時間問題。