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...) }
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!