Maison  >  Article  >  développement back-end  >  Comment déterminer quand tous les canaux d'une instruction Go Select sont fermés ?

Comment déterminer quand tous les canaux d'une instruction Go Select sont fermés ?

Patricia Arquette
Patricia Arquetteoriginal
2024-11-17 06:43:03367parcourir

How to Determine When All Channels in a Go Select Statement are Closed?

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!

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