Um Missverständnisse über Goroutinen zu klären, Dieser Code wurde im Go Playground ausgeführt:
<code class="go">package main import ( "fmt" ) func other(done chan bool) { done <- true go func() { for { fmt.Println("Here") } }() } func main() { fmt.Println("Hello, playground") done := make(chan bool) go other(done) <-done fmt.Println("Finished.") }</code>
Im Go Playground führte er zu einem Fehler: „Der Vorgang hat zu lange gedauert.“ Dies deutet darauf hin, dass die Goroutine, die in anderen erstellt wurde, auf unbestimmte Zeit läuft.
Die lokale Ausführung desselben Codes erzeugte jedoch die sofortige Ausgabe:
<code class="go">Hello, playground. Finished.</code>
Dies impliziert, dass die Goroutine in anderen Programmen beendet wird, wenn die Haupt-Goroutine ausgeführt wird wird beendet.
Die Ungleichheit ist auf den Standardwert von GOMAXPROCS zurückzuführen.
Auf dem Go-SpielplatzGOMAXPROCS ist auf 1 gesetzt. Dies bedeutet, dass jeweils nur eine Goroutine ausgeführt werden kann. Wenn die in anderen Goroutinen erstellte Goroutine nicht blockiert (z. B. durch Warten auf einen Kanal), wechselt der Scheduler nicht zu anderen Goroutinen.
Da die Haupt-Goroutine auf dem fertigen Kanal blockiert, wechselt der Scheduler zu Goroutine in anderen. Dann startet die Goroutine in anderen eine weitere Goroutine mit einer Endlosschleife. Da GOMAXPROCS 1 ist, wird die Haupt-Goroutine nicht fortgesetzt und die Endlosschleife läuft weiter, was zu einer Zeitüberschreitung führt.
Auf dem lokalen Computer verwendet GOMAXPROCS normalerweise standardmäßig die Anzahl der CPU-Kerne (z. B. 4 oder 8). Dadurch können mehrere Goroutinen gleichzeitig ausgeführt werden. Wenn die Haupt-Goroutine den Kanal „Fertig“ blockiert, wechselt der Planer zu einer anderen Goroutine. Dies könnte die Goroutine in anderen sein oder die Goroutine, die die Endlosschleife ausführt.
Da die Haupt-Goroutine irgendwann beendet wird, wird die Endlosschleife nicht mehr ausgeführt. Daher wird das Programm normal beendet, ohne auf den Abschluss der Endlosschleife zu warten.
Beim Ausführen von Goroutinen im Go Playground ist es wichtig, den Standardwert von GOMAXPROCS zu berücksichtigen. Um die Parallelität mehrerer Goroutinen zu simulieren, legen Sie GOMAXPROCS explizit auf einen höheren Wert fest, z. B. runtime.GOMAXPROCS(2). Bei der lokalen Ausführung ermöglicht die Standardeinstellung von GOMAXPROCS normalerweise das erwartete Parallelitätsverhalten.
Das obige ist der detaillierte Inhalt vonWie verhalten sich Goroutinen zwischen Go-Playground und lokaler Maschine unterschiedlich?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!