Asynchrones Lesen aus mehreren Kanälen in Golang
In Go spielen Goroutinen eine entscheidende Rolle bei der parallelen Programmierung. Oft ist es notwendig, Daten von mehreren Kanälen gleichzeitig zu lesen, um eine optimale Leistung zu erzielen.
Stellen Sie sich das folgende Szenario vor: Die Goroutinen numgen1 und numgen2 schreiben gleichzeitig Zahlen in die Kanäle num1 bzw. num2. Ihre Aufgabe besteht darin, eine neue Goroutine, addnum, zu erstellen, die aus diesen Kanälen liest, ihre Werte addiert und das Ergebnis in einen neuen Kanal, sum, schreibt.
Zunächst könnten Sie eine Lösung wie diese versuchen:
func addnum(num1, num2, sum chan int) { done := make(chan bool) go func() { n1 := <-num1 // Read from channel done <- true // Signal completion }() n2 := <-num2 // Read from channel <-done // Wait for completion sum <- n1 + n2 // Write to destination channel }
Dieser Ansatz ist jedoch fehlerhaft, da er nicht das gleichzeitige Lesen von beiden Kanälen garantiert.
Lösung: Verwenden von select
Eine effizientere Lösung beinhaltet die Verwendung des Select-Schlüsselworts von Go, mit dem Sie nicht blockierende Lesevorgänge von mehreren Kanälen ausführen können:
func addnum(num1, num2 <-chan int, sum chan<- int) { for { select { case n1 := <-num1: select { case n2 := <-num2: sum <- n1 + n2 default: // Store value back in channel num1 <- n1 } case n2 := <-num2: select { case n1 := <-num1: sum <- n1 + n2 default: // Store value back in channel num2 <- n2 } } } }
In diesem Code läuft die for-Schleife unbegrenzt und wartet kontinuierlich auf Daten entweder auf Num1 oder Num2. Wenn Daten auf einem Kanal empfangen werden, versucht der innere Select, vom anderen Kanal zu lesen. Bei Erfolg werden die Werte addiert und an den Summenkanal gesendet.
Hinweis:
Das obige ist der detaillierte Inhalt vonWie kann man in Golang effizient Daten aus mehreren Kanälen gleichzeitig lesen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!