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
Freigeben: 2024-11-23 10:16:11
Original
1043 Leute haben es durchsucht

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
}
Nach dem Login kopieren

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)
}
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage