Heim >Backend-Entwicklung >Golang >Wie behebt man „Schwerwiegender Fehler: Alle Goroutinen schlafen – Deadlock!' in Go bei Verwendung ungepufferter Kanäle?
Problem:
Sie haben eine Textdatei mit einer einzelnen Wortzeile und versuchen, jedes Wort in einem Kanal zu speichern. Anschließend möchten Sie diese Wörter aus dem Kanal abrufen und einzeln ausdrucken. Der folgende Codeausschnitt stellt Ihren aktuellen Ansatz dar:
package main import ( "bufio" "fmt" "os" ) 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) } }
Beim Ausführen dieses Codes erhalten Sie jedoch die Fehlermeldung: „Schwerwiegender Fehler: Alle Goroutinen schlafen – Deadlock!“
Lösung:
Der Fehler tritt auf, weil Ihr file1chan ein ungepufferter Kanal ist. Wenn Sie versuchen, einen Wert über diesen Kanal zu senden, blockiert er auf unbestimmte Zeit und wartet auf einen Empfänger. Um diesen Deadlock zu beheben, können Sie entweder eine neue Goroutine starten, die für das Senden von Werten an den Kanal verantwortlich ist, oder den Kanal als gepuffert deklarieren. Im Folgenden werden zwei Ansätze beschrieben:
Verwendung einer neuen Goroutine:
package main import ( "bufio" "fmt" "os" ) func main() { f, _ := os.Open("D:\input1.txt") scanner := bufio.NewScanner(f) file1chan := make(chan string) // Start a new goroutine to send strings down file1chan go func() { for scanner.Scan() { line := scanner.Text() parts := strings.Fields(line) for i := range parts { file1chan <- parts[i] } } close(file1chan) // Close the channel when done sending. }() print(file1chan) // Read strings from file1chan } func print(in <-chan string) { for str := range in { fmt.Printf("%s\n", str) } }
Verwendung eines gepufferten Kanals:
Für Wenn Sie eine einzelne Zeichenfolge verarbeiten, können Sie einen gepufferten Kanal der Größe 1 definieren:
package main import ( "bufio" "fmt" "os" ) func main() { f, _ := os.Open("D:\input1.txt") scanner := bufio.NewScanner(f) file1chan := make(chan string, 1) // Buffer size of one for scanner.Scan() { line := scanner.Text() parts := strings.Fields(line) for i := range parts { file1chan <- parts[i] } } close(file1chan) // Close the channel when done sending. print(file1chan) } func print(in <-chan string) { for str := range in { // Read all values until channel gets closed fmt.Printf("%s\n", str) } }
Das obige ist der detaillierte Inhalt vonWie behebt man „Schwerwiegender Fehler: Alle Goroutinen schlafen – Deadlock!' in Go bei Verwendung ungepufferter Kanäle?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!