Heim >Backend-Entwicklung >Golang >Wie behebt man „Schwerwiegender Fehler: Alle Goroutinen schlafen – Deadlock!' in Go bei Verwendung ungepufferter Kanäle?

Wie behebt man „Schwerwiegender Fehler: Alle Goroutinen schlafen – Deadlock!' in Go bei Verwendung ungepufferter Kanäle?

Barbara Streisand
Barbara StreisandOriginal
2024-11-25 15:36:17706Durchsuche

 How to Resolve

"Go: Schwerwiegender Fehler: Alle Goroutinen schlafen - Deadlock"

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!

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