Heim >Backend-Entwicklung >Golang >Wie behebe ich den Fehler „Alle Goroutinen schlafen – Deadlock' in Go?

Wie behebe ich den Fehler „Alle Goroutinen schlafen – Deadlock' in Go?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-11-23 10:16:111039Durchsuche

How to Resolve the

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn