Die Rolle von time.sleep bei der Goroutine-Ausführung verstehen
In Go sind Goroutinen leichte, gleichzeitig ausgeführte Threads. Während die Kombination von Goroutinen mit der Kanalkommunikation robuste Nebenläufigkeitsprimitive liefert, erfordern bestimmte Szenarien die Verwendung von Blockierungsfunktionen wie time.sleep, um Hunger zu verhindern und eine faire Ausführung sicherzustellen.
Bedenken Sie den folgenden Codeausschnitt aus dem Go-Tutorial:
package main import ( "fmt" "time" ) func say(s string) { for i := 0; i < 5; i++ { time.Sleep(100 * time.Millisecond) fmt.Println(s) } } func main() { go say("world") say("hello") }
Bei der Ausführung druckt dieser Code fünfmal abwechselnd „Hallo“ und „Welt“ auf dem Bildschirm aus. Wenn time.Sleep jedoch auskommentiert ist, wird nur „Hallo“ gedruckt. Dieses Verhalten unterstreicht die Bedeutung von time.Sleep bei der Goroutine-Ausführung.
Der Go-Laufzeitplaner ist nicht präventiv. Das bedeutet, dass Goroutinen freiwillig die Kontrolle abgeben müssen, um anderen Goroutinen die Ausführung zu ermöglichen. Eine Möglichkeit, die Kontrolle freizugeben, ist die Verwendung von time.Sleep.
Wenn im obigen Codeausschnitt time.Sleep entfernt wird, wird die Goroutine „Hallo“ fünf Iterationen lang ausgeführt, ohne der Goroutine „Welt“ Gelegenheit zu geben ausführen. Wenn die „Hallo“-Goroutine beendet ist, wird das Programm daher beendet, da keine anderen Goroutinen vorhanden sind, die es am Leben halten.
Daher spielt time.Sleep eine entscheidende Rolle bei der Gewährleistung der Fairness bei der Goroutine-Planung. Durch die Einführung kurzer Verzögerungen bei der Ausführung bestimmter Goroutinen wird die Ausführung anderer Goroutinen ermöglicht und ein Aushungern oder vollständiges Aushungern anderer Goroutinen verhindert.
Das obige ist der detaillierte Inhalt vonWie verhindert „time.Sleep()' den Goroutine-Hunger in Go?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!