Go: Schwerwiegender Fehler „Alle Goroutinen schlafen – Deadlock“ erklärt
In Go blockiert das Senden an einen ungepufferten Kanal den Absender, bis a Receiver vorhanden ist. Im bereitgestellten Code ist die Goroutine, die für das Senden von Wörtern an den file1chan-Kanal verantwortlich ist, die einzige Goroutine, und es gibt keinen Empfänger. Folglich wird der Absender auf unbestimmte Zeit blockiert, was zu einem Deadlock führt.
Lösung mit einer neuen Goroutine:
Eine Lösung besteht darin, eine separate Goroutine für den Versand zu erstellen Worte. Diese Goroutine blockiert nicht die Haupt-Goroutine und ermöglicht die gleichzeitige Ausführung.
func main() { f, _ := os.Open("D:\input1.txt") scanner := bufio.NewScanner(f) file1chan := make(chan string) go func() { // start a new goroutine that sends strings down file1chan for scanner.Scan() { line := scanner.Text() // Split the line on a space parts := strings.Fields(line) for i := range parts { file1chan <- parts[i] } } close(file1chan) }() print(file1chan) // read strings from file1chan }
Lösung mit einem gepufferten Kanal:
Eine andere Lösung besteht darin, einen gepufferten Kanal zu erstellen. Dadurch können mehrere Werte gleichzeitig gesendet und empfangen werden. Für das gegebene Problem ist eine Puffergröße von eins ausreichend.
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() // Split the line on a space parts := strings.Fields(line) for i := range parts { file1chan <- parts[i] } } close(file1chan) // we're done sending to this channel now, so we close it. print(file1chan) }
Das obige ist der detaillierte Inhalt vonWie behebe ich den Fehler „Alle Goroutinen schlafen – Deadlock' in Go?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!