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?
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.
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!
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!