Goroutinen blockieren andere
In Go ist eine Goroutine ein leichter Ausführungsthread. Normalerweise können Goroutinen gleichzeitig ausgeführt werden, ohne sich gegenseitig zu blockieren. Unter bestimmten Umständen kann eine Goroutine jedoch die Ausführung anderer blockieren.
Bedenken Sie den folgenden Code:
func main() { timeout := make(chan int) go func() { time.Sleep(time.Second) timeout <- 1 }() res := make(chan int) go func() { for { } res <- 1 }() select { case <-timeout: fmt.Println("timeout") case <-res: fmt.Println("res") } }
In diesem Beispiel wird eine Goroutine mit einer Endlosschleife gestartet. Normalerweise sollte diese Goroutine die Ausführung anderer Goroutinen nicht verhindern. Es scheint jedoch, dass die erste Goroutine die zweite Goroutine irgendwie daran hindert, an den Timeout-Kanal zu senden.
Erklärung
Dieses Verhalten ist auf die Art und Weise zurückzuführen, wie Goroutinen funktionieren in Go geplant. Es wird kooperatives Scheduling verwendet, was bedeutet, dass Goroutinen die Ausführung freiwillig dem Scheduler überlassen müssen, damit eine andere Goroutine ausgeführt werden kann. Im bereitgestellten Code gibt die Goroutine mit der Endlosschleife niemals nach, was die andere Goroutine daran hindert, Fortschritte zu machen.
Goroutinen geben normalerweise unter den folgenden Bedingungen nach:
In diesem Fall ist keine dieser Bedingungen erfüllt, also die Goroutine Dabei läuft die Endlosschleife weiter Auf unbestimmte Zeit.
Lösungen
Um dieses Problem zu lösen, gibt es mehrere mögliche Lösungen:
Die beste Lösung für Ihre spezifische Anwendung hängt von der Art der Goroutinen und dem gewünschten Verhalten ab.
Das obige ist der detaillierte Inhalt vonWie kann eine Goroutine mit einer Endlosschleife andere Goroutinen in Go blockieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!