Supprimer une instruction Select lorsque tous les canaux sont fermés
Considérez un scénario dans lequel plusieurs goroutines envoient des données à des canaux individuels et vous souhaitez consommer ces données dans un ordre arbitraire. L’utilisation d’une instruction select offre un moyen pratique de gérer les entrées simultanées provenant de plusieurs sources. Cependant, le défi se pose lorsque vous devez quitter la boucle uniquement lorsque tous les canaux sont fermés.
Solution naïve
Une approche intuitive peut impliquer de vérifier la disponibilité de chaque canal en utilisant le drapeau ok. Cependant, cette solution est sujette aux erreurs car un canal fermé redevient disponible s'il est sélectionné. Cela conduit à une boucle infinie, comme le démontre cet exemple de terrain de jeu : http://play.golang.org/p/rOjdvnji49.
Solution améliorée
Une solution plus Une approche efficace consiste à utiliser le fait qu’un canal nul n’est jamais prêt pour la communication. Chaque fois qu'un canal se ferme, il peut être défini sur zéro, garantissant ainsi son exclusion des futures instructions de sélection. Cela garantit que la boucle ne se termine que lorsque tous les canaux sont fermés :
for { select { case x, ok := <-ch: fmt.Println("ch1", x, ok) if !ok { ch = nil } case x, ok := <-ch2: fmt.Println("ch2", x, ok) if !ok { ch2 = nil } } if ch == nil && ch2 == nil { break } }
Exemple de Playground : http://play.golang.org/p/8lkV_Hffyj
Considérations pratiques
En pratique, il est peu probable que vous ayez besoin de gérer un grand nombre de chaînes dans une seule instruction select. Si un tel scénario se présente, il est conseillé d'utiliser une solution plus spécialisée, comme un multiplexeur de canaux, pour éviter d'encombrer le code avec des contrôles nuls excessifs.
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!