Heim > Artikel > Backend-Entwicklung > Warum stoßen Go-Programme auf den „schwerwiegenden Fehler: Alle Goroutinen schlafen – Deadlock!“ und wie kann er behoben werden?
Go: Deadlock-Panik – Ursache verstehen und beheben
In Go ist ein häufiger Fehler „Schwerwiegender Fehler: Alle Goroutinen sind betroffen.“ eingeschlafen - Stillstand!“ beim Versuch, die Kommunikation zwischen Goroutinen zu verwalten. Dieser Fehler tritt auf, wenn Goroutinen in einem Zustand stecken bleiben, in dem sie alle darauf warten, dass der andere fortfährt.
Problemstellung
Bedenken Sie den folgenden Code, den Sie lesen möchten eine Zeile mit Wörtern aus einer Textdatei, speichern Sie sie in einem Kanal und drucken Sie sie dann einzeln aus:
func main() { f, _ := os.Open("D:\input1.txt") scanner := bufio.NewScanner(f) file1chan := make(chan string) for scanner.Scan() { line := scanner.Text() parts := strings.Fields(line) for i := range parts { file1chan <- parts[i] } } print(file1chan) } func print(in <-chan string) { for str := range in { fmt.Printf("%s\n", str) } }
Ursache des Deadlocks
Beim Ausführen dieses Codes , tritt der Deadlock-Fehler auf. Dies liegt daran, dass der Kanal file1chan ungepuffert ist. Wenn Sie also versuchen, einen Wert an den Kanal zu senden, blockiert dieser auf unbestimmte Zeit und wartet auf einen Empfänger.
Deadlock beheben
Um den Deadlock aufzulösen, Sie haben zwei Möglichkeiten:
Verwenden Sie einen gepufferten Kanal:
Sie können einen gepufferten Kanal erstellen, indem Sie seine Größe als zweites Argument für make(chan) angeben. , etwa so:
file1chan := make(chan string, 1) // buffer size of one
Ein gepufferter Kanal verhält sich wie ein Array, in dem der Absender Werte ohne Blockierung senden kann, wenn der Kanal über verfügbare Kapazität verfügt.
Verwenden Sie eine neue Goroutine:
Sie können eine neue Goroutine starten, um Werte an den ungepufferten Kanal zu senden:
file1chan := make(chan string) go func() { // start a new goroutine that sends strings down file1chan for scanner.Scan() { line := scanner.Text() parts := strings.Fields(line) for i := range parts { file1chan <- parts[i] } } close(file1chan) }() print(file1chan)
Mit diesem Ansatz übernimmt die neue Goroutine die Verantwortung für das Senden von Werten, während Die Haupt-Goroutine konzentriert sich auf das Drucken.
Durch die Implementierung einer dieser Lösungen beseitigen Sie effektiv den Stillstand und ermöglichen eine reibungslose Kommunikation zwischen Ihren Goroutinen.
Das obige ist der detaillierte Inhalt vonWarum stoßen Go-Programme auf den „schwerwiegenden Fehler: Alle Goroutinen schlafen – Deadlock!“ und wie kann er behoben werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!