Maison >développement back-end >Golang >Comment lire efficacement les données de plusieurs canaux simultanément dans Golang ?

Comment lire efficacement les données de plusieurs canaux simultanément dans Golang ?

DDD
DDDoriginal
2024-11-08 13:44:01902parcourir

How to Efficiently Read Data from Multiple Channels Concurrently in Golang?

Lecture asynchrone à partir de plusieurs canaux en Golang

En Go, les Goroutines jouent un rôle crucial dans la programmation parallèle. Souvent, il devient nécessaire de lire les données de plusieurs canaux simultanément pour obtenir des performances optimales.

Considérez le scénario suivant : les Goroutines numgen1 et numgen2 écrivent simultanément des nombres sur les canaux num1 et num2, respectivement. Votre tâche consiste à créer un nouveau Goroutine, addnum, qui lit ces canaux, en ajoutant leurs valeurs et en écrivant le résultat dans un nouveau canal, sum.

Au départ, vous pouvez essayer une solution comme celle-ci :

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
}

Cependant, cette approche est imparfaite car elle ne garantit pas la lecture simultanée des deux canaux.

Solution : Utiliser select

Une solution plus efficace implique d'utiliser le mot-clé select de Go, qui vous permet d'effectuer des lectures non bloquantes à partir de plusieurs canaux :

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
            }
        }
    }
}

Dans ce code, la boucle for s'exécute indéfiniment, écoutant en permanence les données sur num1 ou num2. Lorsque des données sont reçues sur un canal, la sélection interne tente de lire sur l'autre canal. En cas de succès, les valeurs sont ajoutées et envoyées au canal de somme.

Remarque :

  • Les canaux directionnels (par exemple, chan<- int) appliquent la direction du flux de données, évitant ainsi les erreurs.
  • L'utilisation de lectures non bloquantes (<-) évite le blocage lorsqu'aucune donnée n'est disponible, garantissant ainsi la concurrence.
  • Stockage des valeurs dans les canaux lorsque le cas de sélection correspondant l'échec empêche la perte de données.

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