Maison > Article > développement back-end > Comment déterminer quand tous les canaux d'une instruction Go Select sont fermés ?
Déterminer quand tous les canaux d'une instruction Select sont fermés
Lorsque vous travaillez avec des canaux Go, il est courant de consommer les données de plusieurs canaux simultanément en utilisant une instruction select. Cependant, déterminer quand tous les canaux sont fermés et doivent mettre fin à la boucle peut être difficile.
Approches courantes
Une approche simple consiste à utiliser un cas par défaut dans l'instruction select. Cependant, cela peut introduire des problèmes d'exécution potentiels si le cas par défaut est déclenché par inadvertance alors que les canaux sont encore ouverts.
for { select { case p, ok := <-mins: if ok { fmt.Println("Min:", p) } case p, ok := <-maxs: if ok { fmt.Println("Max:", p) } default: // May not be reliable if channels are still open break } }
Canaux nuls
Une solution plus efficace consiste à exploitez le fait que les canaux nuls ne sont jamais prêts pour la communication. Cela nous permet de définir un canal sur zéro une fois qu'il est fermé, le supprimant ainsi de la prise en compte de la boucle de sélection.
for { select { case p, ok := <-mins: fmt.Println("Min:", p) if !ok { mins = nil } case p, ok := <-maxs: fmt.Println("Max:", p) if !ok { maxs = nil } } if mins == nil && maxs == nil { break } }
Maintenir la concision
Bien que cette approche puisse semble verbeux pour gérer un grand nombre de canaux, il garantit une solution concise et fiable. Il est peu probable qu'un seul goroutine fonctionne simultanément avec un nombre excessif de canaux, ce qui rend la lourdeur d'un problème rare.
En adoptant la technique du canal nul, vous pouvez mettre fin efficacement aux boucles sélectionnées lorsque tous les canaux sont fermés, garantissant ainsi que vos goroutines restent réactives et exemptes de fuites de ressources.
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!