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

WBOY
Freigeben: 2024-02-10 21:40:25
nach vorne
977 Leute haben es durchsucht

为什么我会收到 - 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()
}
Nach dem Login kopieren

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

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

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

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!

Verwandte Etiketten:
Quelle:stackoverflow.com
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
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!