Maison >développement back-end >Golang >Comment lire simultanément à partir de plusieurs canaux dans Go ?
Concurrence et communication par canal dans Golang : lecture simultanée à partir de plusieurs canaux
Dans le royaume de Golang, vous pouvez rencontrer le besoin de lire à partir de plusieurs canaux simultanément. Cette requête spécifique est centrée sur la construction d'une configuration de canal « n'importe lequel à un », dans laquelle deux routines go (numgen1 et numgen2) écrivent simultanément des nombres dans des canaux séparés (num1 et num2) et l'objectif est d'agréger ces nombres dans un troisième passage. -routine (addnum).
Considérez le suivant :
<code class="go">func addnum(num1, num2, sum chan int) { done := make(chan bool) go func() { n1 := <-num1 done <- true }() n2 := <-num2 <-done sum <- (n1 + n2) }</code>
Problème :
Malheureusement, l'extrait de code fourni est défectueux. Il repose sur un mécanisme d'interrogation et est sujet aux blocages.
Solution :
Une solution robuste à ce problème consiste à utiliser une instruction select :
<code class="go">func main() { c1 := make(chan int) c2 := make(chan int) out := make(chan int) go func(in1, in2 <-chan int, out chan<- int) { for { select { case n1 := <-in1: out <- n1 case n2 := <-in2: out <- n2 } } }(c1, c2, out) }</code>
Explication :
L'instruction select bloque effectivement jusqu'à ce que les données arrivent sur n'importe lequel des canaux d'entrée, créant essentiellement un canal "n'importe lequel vers un". Lorsque les données deviennent disponibles, elles sont immédiatement envoyées via le canal de sortie.
Cette méthode gère avec élégance la situation dans laquelle les données peuvent arriver sur l'un ou l'autre canal à des intervalles imprévisibles. Il élimine également le risque de blocages en attendant constamment les entrées des deux sources.
N'oubliez pas d'utiliser les types de canaux directionnels comme paramètres formels pour les fonctions goroutine. Cette pratique améliore la sécurité du code en garantissant que le compilateur aide à empêcher une utilisation inappropriée des canaux.
Grâce à ces informations, vous pouvez désormais gérer en toute confiance la communication des canaux simultanés dans Golang.
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!