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 :
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!