Heim > Artikel > Backend-Entwicklung > Wie behebt man den „schwerwiegenden Fehler: Alle Goroutinen schlafen – Deadlock“ in Go?
Go: „Schwerwiegender Fehler: Alle Goroutinen schlafen – Deadlock“ verstehen und beheben
Beim Ausführen eines Go-Programms wird die Fehlermeldung angezeigt „Schwerwiegender Fehler: Alle Goroutinen schlafen – Deadlock“ zeigt an, dass alle Goroutinen (Lightweight-Threads) des Programms auf unbestimmte Zeit blockiert sind. Dies führt zu einem Deadlock.
Im bereitgestellten Code entsteht dieses Problem aufgrund der ungepufferten Natur des „file1chan“-Kanals. Wenn ein Wert an einen ungepufferten Kanal gesendet wird, blockiert dieser, sofern keine andere Goroutine zum Empfang bereit ist. In diesem Fall sendet die Haupt-Goroutine Werte an „file1chan“, ohne dass gleichzeitige Goroutinen von ihr empfangen, was zu einem Deadlock führt.
Lösung 1: Einführen eines Parallelitätsmusters
Um den Deadlock zu beheben, führen Sie eine separate, gleichzeitige Goroutine ein, die Werte von „file1chan“ empfängt und ein Blockieren der Haupt-Goroutine vermeidet. Der modifizierte Code mit einem Goroutine-Ansatz unten:
func main() { f, _ := os.Open("D:\input1.txt") scanner := bufio.NewScanner(f) file1chan := make(chan string) go func() { for scanner.Scan() { line := scanner.Text() parts := strings.Fields(line) for i := range parts { file1chan <- parts[i] } } close(file1chan) }() print(file1chan) }
Lösung 2: Verwenden Sie einen gepufferten Kanal
Alternativ können Sie einen gepufferten Kanal verwenden, um eine feste Nummer zu verarbeiten von Werten, ohne einen Deadlock zu verursachen. Für diese Aufgabe ist ein gepufferter Kanal mit einer Kapazität von eins ausreichend:
func main() { f, _ := os.Open("D:\input1.txt") scanner := bufio.NewScanner(f) file1chan := make(chan string, 1) for scanner.Scan() { line := scanner.Text() parts := strings.Fields(line) for i := range parts { file1chan <- parts[i] } } close(file1chan) print(file1chan) }
Mit einem gepufferten Kanal kann der Sender die Ausführung auch dann fortsetzen, wenn der Empfänger noch nicht bereit ist, wodurch der Deadlock vermieden wird.
Das obige ist der detaillierte Inhalt vonWie behebt man den „schwerwiegenden Fehler: Alle Goroutinen schlafen – Deadlock“ in Go?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!