2013-07-25 14 views
24

Ist garantiert, dass GOMAXPROCS auf 1 festgelegt wird, wenn die Umgebungsvariable mit demselben Namen nicht festgelegt ist?Wie lautet der GOMAXPROCS-Standardwert

Dieser Code zeigt den Wert:

package main 

import (
    "runtime" 
    "fmt" 
) 

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

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

und es wie folgt ausgeführt werden:

$ GOMAXPROCS= go run max.go 
GOMAXPROCS is 1 

zeigt, dass es in diesem Fall 1 ist, aber ich bin für einige Bestätigung hier suchen.

Antwort

18

Nein, es gibt keine Garantie dafür, was der Standard ist; obwohl alle bekannten Implementierungen den Wert '1' verwenden. Wenn Ihr Code in Abwesenheit der Umgebungsvariablen einen bestimmten Standardwert erfordert, sollten Sie ihn im Code festlegen. Additionally:

GOMAXPROCS legt die maximale Anzahl von CPUs fest, die gleichzeitig ausgeführt werden können, und gibt die vorherige Einstellung zurück. Wenn n < 1, ändert es nicht die aktuelle Einstellung. Die Anzahl der logischen CPUs auf dem lokalen Rechner kann mit NumCPU abgefragt werden. Dieser Anruf wird verschwinden, wenn der Scheduler verbessert wird.

(Hervorhebung von mir)

+3

GOMAXPROCS sollte frühestens Go 2.0 verlassen, sonst würde es die Go 1-Garantie brechen: dass keine API-Änderungen vorgenommen werden, die Builds erstellen oder das Standard-Bibliotheksverhalten verändern, es sei denn, es handelt sich um einen Bugfix. Da GOMAXPROCS ein wenig merkwürdig ist und die Laufzeit direkt beeinflusst, kann es sich eher um einen Vorschlag als um einen Befehl handeln, aber es wird nicht plötzlich in Go 1.2 oder irgendetwas verschwinden. – LinearZoetrope

+0

@Jsor Wenn GOMAXPROCS das Verhalten von etwas ändern sollte, würde es für mich wie ein Fehler klingen? – inf

+0

@inf Es wäre kein Bug, weil es die Semantik der Sprache (das Endergebnis) nicht beeinflusst. Das einzige Mal, dass es die Semantik beeinflussen kann, ist es, wenn Sie mit undefiniertem/illegalem Verhalten spielen, wie zum Beispiel Rassenbedingungen. Denken Sie an GOMAXPROCS wie "Inline" -Direktiven in C++, der Compiler darf es ignorieren, weil es manchmal besser als Sie weiß, aber es beeinflusst auch nicht das Endergebnis, es sei denn, Sie machen wirklich seltsame Dinge. GOMAXPROCS ist eine Laufzeit-Direktive, aber das selbe gilt (obwohl Dinge wie OpenGL zu beachten sind). – LinearZoetrope

8

mit Go Ab 1.5 wird GOMAXPROCS Anzahl der standardmäßig verfügbaren CPUs eingestellt. Sie können sie jedoch explizit mit der Umgebungsvariable GOMAXPROCS oder durch den Aufruf von runtime.GOMAXPROCS festlegen.

https://docs.google.com/document/d/1At2Ls5_fhJQ59kDK2DFVhFu3g5mATSXqqV5QrxinasI/preview?sle=true

+3

Beachten Sie, dass dies (zur Zeit) nur ein Vorschlag ist, und selbst wenn dies akzeptiert wird, wird die Standardeinstellung möglicherweise auf 1 zurückgesetzt, wenn unvorhergesehene Probleme auftreten. –

21

Wie Go 1.5 Release Notes sagt

standardmäßig Go-Programme mit GOMAXPROCS laufen zur Verfügung, die Anzahl der Kerne festgelegt; in früheren Versionen es auf 1 vorbelegt von So

Go Start 1.5, sollte der Standardwert der Anzahl der Kerne sein.

+0

Was passiert, wenn GOMAXPROCS> Anzahl der Kerne –

+0

Sie könnten mit einer höheren CPU-Last (Aufgaben, die um CPU-Zeit kämpfen) enden. – Sean

Verwandte Themen