Wie behebt man den „schwerwiegenden Fehler: Alle Goroutinen schlafen – Deadlock' in Go?

DDD
Freigeben: 2024-11-18 07:41:02
Original
698 Leute haben es durchsucht

How to Fix

Go: „Schwerwiegender Fehler: Alle Goroutinen schlafen – Deadlock“ verstehen und beheben

Beim Ausführen eines Go-Programms wird die Fehlermeldung angezeigt „Schwerwiegender Fehler: Alle Goroutinen schlafen – Deadlock“ zeigt an, dass alle Goroutinen (Lightweight-Threads) des Programms auf unbestimmte Zeit blockiert sind. Dies führt zu einem Deadlock.

Im bereitgestellten Code entsteht dieses Problem aufgrund der ungepufferten Natur des „file1chan“-Kanals. Wenn ein Wert an einen ungepufferten Kanal gesendet wird, blockiert dieser, sofern keine andere Goroutine zum Empfang bereit ist. In diesem Fall sendet die Haupt-Goroutine Werte an „file1chan“, ohne dass gleichzeitige Goroutinen von ihr empfangen, was zu einem Deadlock führt.

Lösung 1: Einführen eines Parallelitätsmusters

Um den Deadlock zu beheben, führen Sie eine separate, gleichzeitige Goroutine ein, die Werte von „file1chan“ empfängt und ein Blockieren der Haupt-Goroutine vermeidet. Der modifizierte Code mit einem Goroutine-Ansatz unten:

func main() {
    f, _ := os.Open("D:\input1.txt")
    scanner := bufio.NewScanner(f)
    file1chan := make(chan string)
    go func() { 
        for scanner.Scan() {
            line := scanner.Text()
            parts := strings.Fields(line)
            for i := range parts {
                file1chan <- parts[i]
            }
        }
        close(file1chan)
    }()
    print(file1chan) 
}
Nach dem Login kopieren

Lösung 2: Verwenden Sie einen gepufferten Kanal

Alternativ können Sie einen gepufferten Kanal verwenden, um eine feste Nummer zu verarbeiten von Werten, ohne einen Deadlock zu verursachen. Für diese Aufgabe ist ein gepufferter Kanal mit einer Kapazität von eins ausreichend:

func main() {
    f, _ := os.Open("D:\input1.txt")
    scanner := bufio.NewScanner(f)
    file1chan := make(chan string, 1)
    for scanner.Scan() {
        line := scanner.Text()
        parts := strings.Fields(line)
        for i := range parts {
            file1chan <- parts[i]
        }
    }
    close(file1chan)
    print(file1chan)
}
Nach dem Login kopieren

Mit einem gepufferten Kanal kann der Sender die Ausführung auch dann fortsetzen, wenn der Empfänger noch nicht bereit ist, wodurch der Deadlock vermieden wird.

Das obige ist der detaillierte Inhalt vonWie behebt man den „schwerwiegenden 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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage