Maison >développement back-end >Golang >Comment lire plusieurs chaînes simultanément dans Golang ?

Comment lire plusieurs chaînes simultanément dans Golang ?

Linda Hamilton
Linda Hamiltonoriginal
2024-11-06 12:43:02270parcourir

How to Read Multiple Channels Simultaneously in Golang?

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn