Heim >Backend-Entwicklung >Golang >Warum erhalte ich den Fehler „Goroutinen sind im Ruhezustand', da es sich um ein Problem mit dem Produzenten und Verbraucher handelt?

Warum erhalte ich den Fehler „Goroutinen sind im Ruhezustand', da es sich um ein Problem mit dem Produzenten und Verbraucher handelt?

WBOY
WBOYnach vorne
2024-02-10 21:40:251006Durchsuche

为什么我会收到 - goroutines are sleeped 错误,因为生产者消费者问题

PHP-Editor Youzi kann beim Lösen von Programmierproblemen auf eine häufige Fehlermeldung stoßen: „Goroutinen sind im Ruhezustand“. Dieser Fehler hängt normalerweise mit Producer-Consumer-Problemen zusammen. Das Producer-Consumer-Problem ist ein klassisches Szenario in der gleichzeitigen Programmierung, bei dem ein oder mehrere Producer Daten generieren und ein oder mehrere Consumer sie zur Verarbeitung herausnehmen. Wenn der Produzent Daten schneller generiert, als der Verbraucher die Daten verarbeiten kann, kann dies dazu führen, dass Goroutinen (Lightweight-Threads in der Go-Sprache) in den Ruhezustand wechseln. In diesem Artikel wird erläutert, warum dieser Fehler auftritt, und eine Lösung bereitgestellt.

Frageninhalt

Das ist der Code – Produzent und mehrere Konsumenten in Go-Routine. Der Produzent fügt Informationen in einen Kanal ein und mehrere Verbraucher (jeder über eine Go-Routine) sollten sie parallel lesen.

func main() {
    alphabetArray := []string{"A", "B", "C"}

    alphabetChannel := make(chan string, 3)
    // producer.
    go func() {
        for _, alphabet := range alphabetArray {
            alphabetChannel <- alphabet
        }
    }()

    var wg sync.WaitGroup
    // spawn 10 consumers, consumers represented as a go-routine.
    for idx := 0; idx < 10; idx++ {
        wg.Add(1)
        go func() {
            for alphabet := range alphabetChannel {
                fmt.Println(alphabet)
            }
        }()
    }
    wg.Wait()
}

Hier ist der Link zum Spielplatz – https://go.dev/play/p/yndataeexpb

Der Fehler, den ich erhalten habe, ist dieser -

eins Zweite C Schwerwiegender Fehler: Alle Goroutinen schlafen – Deadlock!

Workaround

Schließen Sie den Kanal, wenn der Produzent fertig ist, damit der Verbraucher weiß, wann er aufhören muss:

go func() {
        defer close(alphabetchannel)
        for _, alphabet := range alphabetarray {
            alphabetchannel <- alphabet
        }
    }()

Teilen Sie der Wartegruppe mit, wann der Verbraucher fertig ist:

go func() {
            defer wg.Done()
            for alphabet := range alphabetChannel {
                fmt.Println(alphabet)
            }
        }()

Das obige ist der detaillierte Inhalt vonWarum erhalte ich den Fehler „Goroutinen sind im Ruhezustand', da es sich um ein Problem mit dem Produzenten und Verbraucher handelt?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen