2013-07-25 210 views
24

當沒有設置相同名稱的環境變量時,保證GOMAXPROCS被設置爲1?什麼是GOMAXPROCS默認值

這段代碼顯示的值:

package main 

import (
    "runtime" 
    "fmt" 
) 

func getGOMAXPROCS() int { 
    return runtime.GOMAXPROCS(0) 
} 

func main() { 
    fmt.Printf("GOMAXPROCS is %d\n", getGOMAXPROCS()) 
} 

像這樣運行它:

$ GOMAXPROCS= go run max.go 
GOMAXPROCS is 1 

表明,正是在這種情況下,1,但我在這裏尋找一些確認。

回答

18

不,不能保證默認設置是什麼;即使所有已知的實現都使用值'1'。如果您的代碼在沒有環境變量的情況下需要特定的默認值,那麼您應該將其設置爲代碼。 Additionally

GOMAXPROCS設置可同時執行的最大CPU數量並返回以前的設置。如果n < 1,它不會更改當前設置。本地機器上的邏輯CPU數量可以通過NumCPU查詢。 當調度程序改進時,此調用將消失。

(重點煤礦)

+3

GOMAXPROCS不應該一直走到Go 2.0,否則它會打破Go 1的保證:除非是錯誤修正,否則不會改變API構建或更改標準庫行爲。由於GOMAXPROCS有點奇怪並直接影響運行時,它可能會成爲一個建議,而不是一個命令,但它不會在Go 1.2中突然消失或任何東西。 – LinearZoetrope

+0

@Jsor如果GOMAXPROCS要改變某些東西的行爲,那聽起來就像是一個bug? – inf

+0

@inf它不會是一個錯誤,因爲它不影響語言的語義(即最終結果)。唯一可以影響語義的是如果你玩的是未定義的/非法的行爲,比如比賽條件。想想GOMAXPROCS就像C++中的'inline'指令一樣,編譯器可以忽略它,因爲它有時比你知道的更好,但它也不會影響最終的結果,除非你做了很奇怪的事情。 GOMAXPROCS是一個運行時指令,但同樣適用(雖然有些事情需要考慮OpenGL)。 – LinearZoetrope

21

由於Go 1.5 Release Notes

默認情況下,進入程序設置爲可用的核心數量GOMAXPROCS運行;在以前的版本中它默認爲1

所以從圍棋1.5開始,默認值應爲芯數的。

+0

如果GOMAXPROCS>核心數量將會發生什麼 –

+0

您可能會因CPU負載較高(任務爲CPU時間而戰)。 – Sean