Heim >Backend-Entwicklung >Golang >So lösen Sie Go-Parallelitäts-Deadlocks: „Alle Goroutinen schlafen'?
Deadlock-Fehler in der Parallelität: „throw: All Goroutines Are Asleep“
Beim Arbeiten mit Parallelität in Go kann es zu einem Deadlock kommen, wenn alle Goroutinen warten darauf, dass einander eine Aktion ausführt. Ein häufiger Fehler im Zusammenhang mit diesem Problem ist „Throw: Alle Goroutinen schlafen – Deadlock!“
Das Problem verstehen
Betrachten Sie das folgende Go-Programm:
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) }
Beim Ausführen dieses Programms tritt die Fehlermeldung „throw: all goroutines are schlafend – Deadlock!“ auf. Der Grund dafür ist, dass die Bereichsschleife in der Gesamtfunktion niemals beendet wird, da wir den Kanal ch nie schließen. Infolgedessen wird die Goroutine, die in der Hauptfunktion auf den Empfang des Ergebnisses wartet, dieses niemals erhalten.
Auflösen des Deadlocks
Um diesen Deadlock aufzulösen, müssen wir schließen den ch-Kanal, um anzuzeigen, dass keine weiteren Werte gesendet werden. Darüber hinaus können wir einen separaten Kanal verwenden, um das Ergebnis zurückzusenden, wodurch ein direktes Senden und Empfangen auf demselben Kanal verhindert wird.
Das überarbeitete Programm unten behebt diese Probleme:
package main import ( "fmt" ) func total(in chan int, out chan int) { res := 0 for iter := range in { res += iter } out <- res // sends back the result } func main() { ch := make(chan int) rch := make(chan int) go total(ch, rch) ch <- 1 ch <- 2 ch <- 3 close(ch) // this will end the loop in the total function result := <-rch // waits for total to give the result fmt.Println("Total is ", result) }
Durch Schließen Durch die Verwendung des CH-Kanals und der Verwendung eines separaten RCH-Kanals für das Ergebnis beseitigen wir den Deadlock und ermöglichen die korrekte Ausführung des Programms.
Das obige ist der detaillierte Inhalt vonSo lösen Sie Go-Parallelitäts-Deadlocks: „Alle Goroutinen schlafen'?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!