Deadlock in Go: „Throw: Alle Goroutinen schlafen“
In einem Go-Programm tritt ein Deadlock auf, wenn zwei oder mehr Goroutinen warten dass der andere fertig wird, was zu einem eingefrorenen Zustand führt, in dem kein Fortschritt erzielt werden kann. Dieses Problem wird oft als „Throw: Alle Goroutinen schlafen – Deadlock“ gemeldet.
Lassen Sie uns ein vereinfachtes Go-Programm analysieren, um zu verstehen, warum dieser Deadlock auftritt:
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) }
In diesem Programm ist die Die Gesamtfunktion berechnet die Summe der über den Kanal gesendeten Zahlen und sendet das Ergebnis auf demselben Kanal zurück. Der Deadlock entsteht, weil die folgenden Bedingungen erfüllt sind:
Dies führt zu einer Deadlock-Situation, in der beide Goroutinen (die eine mit laufender Summe und die eine in main) warten darauf, dass der andere reagiert, was zum Fehler „Throw: Alle Goroutinen schlafen“ führt.
Um diesen Deadlock zu beheben, können wir die schließen ch-Kanal in der Hauptfunktion nach dem Senden des letzten Werts:
ch <- 3 close(ch)
Das Schließen des Kanals signalisiert der gesamten Goroutine, dass keine Eingabe mehr erfolgt, sodass sie ihre Berechnung abschließen und das Ergebnis an ch zurücksenden kann.
Das obige ist der detaillierte Inhalt vonGo Deadlock: Warum passiert „werfen: Alle Goroutinen schlafen'?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!