Lecture simultanée de plusieurs canaux dans Golang
Lorsque vous travaillez avec concurrence dans Golang, les tâches sont souvent divisées en plusieurs goroutines communiquant via des canaux. Dans les situations où plusieurs goroutines produisent des valeurs destinées à être consommées par un seul destinataire, le besoin se fait sentir d'un canal qui collecte simultanément des données provenant de plusieurs sources. Cet article répond à cette exigence en explorant une approche efficace pour construire de tels canaux « tout-à-un » dans Go.
Comprendre le défi
Considérez deux goroutines, numgen1 et numgen2, écrivant des nombres sur des canaux séparés, num1 et num2, respectivement. L'objectif est de créer un nouveau processus, addnum, qui additionne les nombres reçus de ces canaux.
Une solution proposée
Une première tentative pourrait impliquer l'utilisation d'opérations de réception individuelles. sur les deux canaux au sein d'une seule goroutine :
func addnum(num1, num2, sum chan int) { done := make(chan bool) go func() { n1 := <-num1 done <- true }() n2 := <-num2 <-done sum <- n1 + n2 }
Cependant, cette approche souffre d'un problème fondamental : elle ne lit que d'un canal à la fois, attendant chaque valeur avant de passer à la suivante.
Une approche plus efficace
Pour permettre la lecture simultanée à partir de plusieurs canaux, l'instruction select peut être utilisée. Cette construction permet à une goroutine d'attendre des opérations sur plusieurs canaux simultanément :
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) }
Dans cet exemple, l'instruction select attend en permanence des données sur c1 ou c2. Lorsqu'une valeur est reçue d'un canal, elle est ajoutée à une somme, qui est ensuite transmise au canal de sortie.
Conclusion
En employant l'instruction select, il est possible de créer un canal "n'importe lequel" dans Golang, permettant à plusieurs goroutines d'écrire simultanément sur un seul canal. Cette approche permet une communication et une agrégation de données efficaces dans des systèmes concurrents complexes.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!