Deadlock in Go: „Throw: Alle Goroutinen schlafen“
Ein Goroutine-Deadlock tritt auf, wenn alle laufenden Goroutinen aufeinander warten vollständig. Im bereitgestellten Go-Code entsteht ein Deadlock aufgrund des nicht geschlossenen Kanals ch.
Die Gesamtfunktion wartet mithilfe einer Bereichsschleife kontinuierlich auf neue Werte auf dem Kanal ch. Da der ch-Kanal niemals geschlossen wird, wird die Schleife niemals beendet. Dies bedeutet, dass die Goroutine, die für die Ausführung dieser Funktion verantwortlich ist, niemals beendet wird.
Währenddessen versucht das Programm in der Hauptfunktion, Werte an den Kanal ch zu senden und das Ergebnis zu empfangen. Da die gesamte Goroutine jedoch auf unbestimmte Zeit wartet, kann sie die gesendeten Werte nicht verarbeiten und das Ergebnis nicht zurücksenden. Dies führt zu einem Deadlock des Programms.
Um diesen Deadlock zu beheben, muss der Kanal nach dem Senden aller Werte geschlossen werden. Dies signalisiert der Summenfunktion, nicht mehr auf neue Werte zu warten und das Ergebnis zu berechnen.
Hier ist eine modifizierte Version des Codes mit der Kanalschließung:
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) }
Nun die laufende Summe der Goroutine führt die Summierung korrekt durch und sendet das Ergebnis zurück an main, wodurch ein Deadlock verhindert wird.
Das obige ist der detaillierte Inhalt vonGo Deadlocks: Wie vermeide ich den Fehler „Alle Goroutinen schlafen'?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!