Heim >Backend-Entwicklung >Golang >Wie wirkt sich „runtime.Gosched()' auf die Go-Programmausführung vor und nach Go 1.5 aus?
In Go-Versionen vor 1.5 ein Codeabschnitt, der runtime.Gosched() beinhaltet Es wurde beobachtet, dass es die Ausgabe eines Programms beeinflusst:
func say(s string) { for i := 0; i < 5; i++ { runtime.Gosched() fmt.Println(s) } } func main() { go say("world") say("hello") }
Ausgabe mit runtime.Gosched():
hello world hello world hello world hello world hello
Ausgabe ohne runtime.Gosched():
hello hello hello hello hello
In Go-Versionen vor 1.5 ist runtime.Gosched( ) übergab beim Aufruf explizit die Kontrolle an andere Goroutinen. Während Go-Programme standardmäßig auf einem einzelnen Betriebssystem-Thread ausgeführt werden, ermöglichte runtime.Gosched() dem Scheduler, die Ausführung zwischen Goroutinen zu wechseln.
Als GOMAXPROCS deaktiviert oder auf 1 gesetzt war, erforderte das kooperative Multitasking von Go, dass Goroutinen explizit die Kontrolle abgeben . Daher erschien im obigen Codebeispiel die „world“-Ausgabe nur, wenn runtime.Gosched() aufgerufen wurde, da sie es dem Scheduler ermöglichte, zur Goroutine zu wechseln, die die „world“-Druckanweisung ausführte.
In Go 1.5 und höher ist runtime.GOMAXPROCS standardmäßig auf die Anzahl der Hardwarekerne eingestellt, was bedeutet, dass Go mehrere Betriebssystem-Threads erstellen kann Goroutinen ausführen.
Wenn GOMAXPROCS auf einen Wert größer als 1 eingestellt ist, können Goroutinen parallel ausgeführt werden. Anders als in präventiven Multitasking-Systemen müssen Goroutinen jedoch immer noch explizit die Kontrolle abgeben, damit andere Goroutinen ausgeführt werden können. Dies liegt daran, dass Go kooperatives Multitasking verwendet, bei dem Goroutinen freiwillig die Kontrolle an den Scheduler abgeben.
Wenn GOMAXPROCS auf einen Wert größer als 1 eingestellt ist, kann das Ergebnis der Verschachtelung von Goroutinen unbestimmt werden , da der Scheduler die Ausführung jederzeit zwischen ihnen wechseln kann. Dies kann zu unvorhersehbaren Ausgabemustern führen, wie im obigen Beispiel zu sehen ist, als GOMAXPROCS auf 2 gesetzt wurde.
Das obige ist der detaillierte Inhalt vonWie wirkt sich „runtime.Gosched()' auf die Go-Programmausführung vor und nach Go 1.5 aus?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!