Gestion des canaux dans Go pour la concurrence
Dans Go, lors de la gestion des canaux dans des environnements simultanés, il est crucial de s'assurer que les canaux ne se ferment qu'après tout les goroutines ont terminé leurs opérations. Cet article explore deux approches pour y parvenir et présente une alternative utilisant le type sync.WaitGroup.
Méthodes de force brute
La première approche consiste à fermer le canal immédiatement après la génération. tous les goroutines. Cependant, cela peut mettre fin prématurément aux goroutines qui n'ont pas encore envoyé leurs résultats. La deuxième approche compte les goroutines actives et ferme le canal lorsque le décompte atteint zéro. Bien que cela résolve le problème de la première approche, elle repose sur des appels en veille fastidieux ou une attente occupée, qui sont inefficaces.
Solution élégante : sync.WaitGroup
La synchronisation .WaitGroup fournit un mécanisme plus efficace et plus robuste pour attendre plusieurs goroutines. Il vous permet de suivre progressivement le nombre de goroutines actives et d'attendre qu'elles soient toutes terminées. En incorporant un sync.WaitGroup, votre code peut être réécrit comme suit :
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...) }
Cette approche garantit que le canal se ferme uniquement une fois toutes les goroutines terminées, éliminant ainsi le besoin d'appels de mise en veille ou de conditions de concurrence potentielles.
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!