Maison > développement back-end > Golang > Comment fermer correctement les chaînes une fois que tous les Goroutines ont terminé Go ?

Comment fermer correctement les chaînes une fois que tous les Goroutines ont terminé Go ?

Mary-Kate Olsen
Libérer: 2024-12-19 02:06:12
original
764 Les gens l'ont consulté

How to Properly Close Channels After All Goroutines Finish in Go?

Gérer la fermeture des chaînes pour les goroutines terminées dans Go

Dans Go, gérer la fermeture des chaînes une fois que toutes les goroutines sont terminées peut être un défi. Cet article explore les approches courantes et propose une solution à l'aide de sync.WaitGroup.

Problème :
Lorsque plusieurs goroutines envoient des données à un canal, garantissant que le canal est Il est crucial de le fermer correctement pour éviter la perte de données. Attendre que toutes les goroutines soient terminées avant de fermer la chaîne est le comportement souhaité.

Approche initiale :
Une tentative courante consiste à fermer la chaîne immédiatement après avoir généré toutes les goroutines. Cependant, cela peut amener les goroutines à tenter d'envoyer les résultats à un canal fermé.

Comptage des goroutines :
Une approche plus sophistiquée consiste à compter les goroutines en cours d'exécution et à fermer le canal lorsque le nombre atteint zéro. Bien que cette méthode résolve le problème, elle introduit des erreurs de synchronisation potentielles.

Solution sync.WaitGroup :
La solution recommandée utilise le type sync.WaitGroup, qui simplifie la synchronisation dans les programmes Go simultanés. . En utilisant un WaitGroup, vous pouvez facilement suivre le nombre de goroutines et attendre qu'elles se terminent avant de fermer la chaîne.

Exemple de code :
Voici comment modifier le code d'origine en utilisant sync.WaitGroup :

var wg sync.WaitGroup
for i := 0; i <= 10; i++ {
    wg.Add(1)
    go func(){
        result := calculate()
        c <- result
        wg.Done()
    }()
}

// Close the channel when all goroutines are finished
go func() {
    wg.Wait()
    close(c)
}()

for result := range c {
    all_result = append(all_result, result...)
}
Copier après la connexion

Ici, WaitGroup est utilisé pour compter les goroutines. Chaque goroutine incrémente le décompte avant d'envoyer les données au canal et le décrémente une fois terminé. Une goroutine distincte attend que le décompte atteigne zéro, garantissant que le canal n'est fermé qu'une fois toutes les goroutines terminées.

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal