Heim >Backend-Entwicklung >Golang >Warum kommt es in meinem Go-Programm zu einem Deadlock mit der Fehlermeldung „Alle Goroutinen schlafen'?

Warum kommt es in meinem Go-Programm zu einem Deadlock mit der Fehlermeldung „Alle Goroutinen schlafen'?

DDD
DDDOriginal
2024-12-23 02:11:14904Durchsuche

Why Does My Go Program Deadlock with the

Go-Programm-Deadlock: „Throw: Alle Goroutinen schlafen“

In einem Go-Programm tritt ein Deadlock auf, wenn zwei oder mehr Goroutinen ( (gleichzeitig ausgeführte Funktionen) warten auf unbestimmte Zeit darauf, dass die anderen Funktionen abgeschlossen werden. Eine solche Situation kann bei der Arbeit mit Kanälen auftreten, wie im folgenden Programm zu sehen ist:

package main

import (
    "fmt"
)

func total(ch chan int) {
    res := 0
    for iter := range ch {
        res += iter
    }
    ch <- res
}

func main() {
    ch := make(chan int)
    go total(ch)
    ch <- 1
    ch <- 2
    ch <- 3
    fmt.Println("Total is ", <-ch)
}

Das Ausführen dieses Programms führt zu der Panikmeldung:

throw: all goroutines are asleep - deadlock!

Die Hauptursache dafür Der Deadlock liegt darin, dass die gesamte Goroutine versucht, einen Wert an denselben Kanal zurückzusenden, den sie von (ch) empfängt. Da der Kanal nicht geschlossen ist (was den Abschluss signalisiert), wird die Bereichsschleife in der gesamten Goroutine auf unbestimmte Zeit fortgesetzt und alle weiteren Sende- oder Empfangsvorgänge blockiert.

Um dieses Problem zu beheben, können wir einen anderen Kanal einführen, um das Ergebnis zu empfangen. Hier ist ein aktualisiertes Programm:

package main

import (
    "fmt"
)

func total(in chan int, out chan int) {
    res := 0
    for iter := range in {
        res += iter
    }
    out <- res // Send result on separate channel
}

func main() {
    ch := make(chan int)
    rch := make(chan int) // New channel to receive result
    go total(ch, rch)
    ch <- 1
    ch <- 2
    ch <- 3
    close(ch) // Explicitly close channel to end loop in `total`
    result := <-rch // Wait for result on `rch`
    fmt.Println("Total is ", result)
}

Indem wir das Ergebnis auf einem separaten Kanal senden und den ursprünglichen Kanal schließen, durchbrechen wir den Deadlock und ermöglichen der Haupt-Goroutine, die berechnete Summe zu empfangen.

Das obige ist der detaillierte Inhalt vonWarum kommt es in meinem Go-Programm zu einem Deadlock mit der Fehlermeldung „Alle Goroutinen schlafen'?. 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