In einer früheren Version von Go zeigte der folgende Code unerwartetes Verhalten, wenn runtime.Gosched() war entfernt:
package main import ( "fmt" "runtime" ) 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
Wenn Go ohne Angabe der Umgebungsvariablen GOMAXPROCS ausgeführt wird, werden alle Goroutinen für die Ausführung in einem einzigen Betriebssystem geplant Faden. Damit das Programm als Multithread-Programm erscheint, muss der Go-Scheduler gelegentlich den Ausführungskontext wechseln.
Kooperatives Multitasking:
Go verwendet ein kooperatives Multitasking-Modell, was bedeutet, dass Goroutinen explizit die Kontrolle abgeben müssen zu anderen Goroutinen. Dies steht im Gegensatz zum präemptiven Multitasking in Betriebssystem-Threads, bei denen der Scheduler die Ausführungskontexte transparent wechselt.
Die Funktion von runtime.Gosched():
In Abwesenheit von präemptivem Multitasking Mit runtime.Gosched() können Goroutinen die Kontrolle an den Scheduler übergeben. Wenn eine Goroutine einen Gosched-Aufruf erreicht, weist der Scheduler sie an, die Ausführung auf eine andere Goroutine umzustellen.
Im bereitgestellten Beispiel bedeutet das Entfernen von Gosched, dass der Ausführungskontext die Hauptroutine nie verlässt. Infolgedessen darf die „Welt“-Goroutine niemals ausgeführt werden und es werden keine „Welt“-Meldungen gedruckt.
GOMAXPROCS auf eine positive Zahl setzen ( Beispielsweise ermöglicht runtime.GOMAXPROCS(2)) Go, bis zu dieser Anzahl nativer Threads zu erstellen. Wenn GOMAXPROCS größer als 1 ist, können Goroutinen so geplant werden, dass sie in verschiedenen Threads ausgeführt werden, was zu echter Parallelität führt.
Wenn GOMAXPROCS auf 2 oder höher eingestellt ist, werden die Goroutinen im Beispiel auch ohne runtime.Gosched verschachtelt () und demonstriert präventives Multitasking.
Das obige ist der detaillierte Inhalt vonWarum ist „runtime.Gosched()' für die Verschachtelung der Goroutine-Ausgabe in Single-Threaded-Go-Programmen von entscheidender Bedeutung?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!