Fermer une chaîne après la fin des goroutines
Lorsque vous travaillez avec des goroutines et des chaînes dans Go, il est souvent nécessaire de déterminer quand toutes les goroutines ont terminé exécuter et fermer le canal en conséquence. Deux approches courantes sont présentées dans la question : fermer explicitement le canal après la génération de goroutines et utiliser le comptage de threads.
Fermeture explicite du canal
La première approche consiste à fermer le canal après toutes les goroutines sont créées. Cependant, il est possible que le canal soit fermé prématurément, empêchant les goroutines d'envoyer leurs résultats.
Thread Counting
Dans la deuxième approche, un nombre de threads est maintenu, et le canal est fermé lorsque le compte atteint zéro. Bien que fonctionnel, il repose sur des appels en veille ou sur une attente occupée, ce qui peut s'avérer inefficace.
Solution Sync.WaitGroup
Un moyen plus efficace et plus fiable d'accomplir cette tâche est pour utiliser le type sync.WaitGroup. WaitGroup permet d'attendre un nombre spécifique de tâches, quel que soit leur ordre d'achèvement. Modifier l'exemple d'origine pour utiliser un WaitGroup ressemblerait à ceci :
import ( "sync" ) func main() { 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 permet aux goroutines de terminer leurs tâches avant de fermer le canal, garantissant ainsi que tous les messages attendus sont reçus.
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!