Gleichzeitiges Lesen mehrerer Kanäle in Golang
Bei der Arbeit mit Parallelität in Golang werden Aufgaben häufig in mehrere Goroutinen unterteilt, die über Kanäle kommunizieren. In Situationen, in denen mehrere Goroutinen Werte erzeugen, die von einem einzelnen Empfänger konsumiert werden, entsteht der Bedarf an einem Kanal, der Daten aus mehreren Quellen gleichzeitig sammelt. Dieser Artikel geht auf diese Anforderung ein, indem er einen effizienten Ansatz zum Aufbau solcher „Any-to-One“-Kanäle in Go untersucht.
Die Herausforderung verstehen
Betrachten Sie zwei Goroutinen, numgen1 und numgen2, die Zahlen in separate Kanäle schreiben, num1 bzw. num2. Das Ziel besteht darin, einen neuen Prozess namens addnum zu erstellen, der die von diesen Kanälen empfangenen Zahlen summiert.
Eine vorgeschlagene Lösung
Ein erster Versuch könnte die Verwendung einzelner Empfangsvorgänge beinhalten auf beiden Kanälen innerhalb einer einzigen Goroutine:
func addnum(num1, num2, sum chan int) { done := make(chan bool) go func() { n1 := <-num1 done <- true }() n2 := <-num2 <-done sum <- n1 + n2 }
Dieser Ansatz hat jedoch ein grundlegendes Problem: Er liest jeweils nur von einem Kanal und wartet für jeden Wert, bevor mit dem nächsten fortgefahren wird.
Ein effizienterer Ansatz
Um das gleichzeitige Lesen mehrerer Kanäle zu ermöglichen, kann die Select-Anweisung verwendet werden. Dieses Konstrukt ermöglicht es einer Goroutine, gleichzeitig auf Operationen auf mehreren Kanälen zu warten:
func main() { c1 := make(chan int) c2 := make(chan int) out := make(chan int) go func(in1, in2 <-chan int, out chan<- int) { for { sum := 0 select { case sum = <-in1: sum += <-in2 case sum = <-in2: sum += <-in1 } out <- sum } }(c1, c2, out) }
In diesem Beispiel wartet die Select-Anweisung kontinuierlich auf Daten auf entweder c1 oder c2. Wenn ein Wert von einem Kanal empfangen wird, wird er zu einer Summe addiert, die dann an den Ausgangskanal ausgegeben wird.
Fazit
Durch Verwendung der Select-Anweisung Es ist möglich, in Golang einen „Any-to-One“-Kanal zu erstellen, der es mehreren Goroutinen ermöglicht, gleichzeitig auf einen einzelnen Kanal zu schreiben. Dieser Ansatz ermöglicht eine effiziente Kommunikation und Datenaggregation in komplexen gleichzeitigen Systemen.
Das obige ist der detaillierte Inhalt vonWie lese ich in Golang mehrere Kanäle gleichzeitig?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!