Go-Routine blockiert andere: Eine tiefere Erklärung
In Go zeigt der folgende Code ein ungewöhnliches Verhalten, bei dem eine Goroutine scheinbar eine Endlosschleife hat verhindert, dass die Nachricht einer anderen Goroutine den vorgesehenen Kanal erreicht:
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") } }
Anstatt das Programm nach einer Sekunde zu beenden gelangt in eine Endlosschleife. Warum passiert das?
Kooperative Planung in Go verstehen
Die Antwort liegt in Gos Verwendung der kooperativen Planung für Goroutinen. Goroutinen geben unter bestimmten Bedingungen die Kontrolle an den Scheduler ab, einschließlich:
Da die Endlosschleife in der ersten Goroutine niemals nachgibt, verhindert sie, dass andere Goroutinen ausgeführt werden und Nachrichten an Kanäle senden. Dazu gehört auch der Timeout-Kanal, der auf eine Nachricht wartet, die nie ankommt.
Mögliche Lösungen
Obwohl kooperative Planung zu solchen Situationen führen kann, gibt es mögliche Lösungen :
Das obige ist der detaillierte Inhalt vonWarum blockiert eine Infinite-Go-Routine das Senden anderer Goroutinen an Kanäle?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!