Go-Programm-Deadlock: „Throw: Alle Goroutinen schlafen“
In einem Go-Programm tritt ein Deadlock auf, wenn zwei oder mehr Goroutinen ( (gleichzeitig ausgeführte Funktionen) warten auf unbestimmte Zeit darauf, dass die anderen Funktionen abgeschlossen werden. Eine solche Situation kann bei der Arbeit mit Kanälen auftreten, wie im folgenden Programm zu sehen ist:
package main import ( "fmt" ) func total(ch chan int) { res := 0 for iter := range ch { res += iter } ch <- res } func main() { ch := make(chan int) go total(ch) ch <- 1 ch <- 2 ch <- 3 fmt.Println("Total is ", <-ch) }
Das Ausführen dieses Programms führt zu der Panikmeldung:
throw: all goroutines are asleep - deadlock!
Die Hauptursache dafür Der Deadlock liegt darin, dass die gesamte Goroutine versucht, einen Wert an denselben Kanal zurückzusenden, den sie von (ch) empfängt. Da der Kanal nicht geschlossen ist (was den Abschluss signalisiert), wird die Bereichsschleife in der gesamten Goroutine auf unbestimmte Zeit fortgesetzt und alle weiteren Sende- oder Empfangsvorgänge blockiert.
Um dieses Problem zu beheben, können wir einen anderen Kanal einführen, um das Ergebnis zu empfangen. Hier ist ein aktualisiertes Programm:
package main import ( "fmt" ) func total(in chan int, out chan int) { res := 0 for iter := range in { res += iter } out <- res // Send result on separate channel } func main() { ch := make(chan int) rch := make(chan int) // New channel to receive result go total(ch, rch) ch <- 1 ch <- 2 ch <- 3 close(ch) // Explicitly close channel to end loop in `total` result := <-rch // Wait for result on `rch` fmt.Println("Total is ", result) }
Indem wir das Ergebnis auf einem separaten Kanal senden und den ursprünglichen Kanal schließen, durchbrechen wir den Deadlock und ermöglichen der Haupt-Goroutine, die berechnete Summe zu empfangen.
Das obige ist der detaillierte Inhalt vonWarum kommt es in meinem Go-Programm zu einem Deadlock mit der Fehlermeldung „Alle Goroutinen schlafen'?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!