Maison >développement back-end >Golang >Pourquoi My Go sync.WaitGroup ne se termine-t-il jamais ?
Golang sync.WaitGroup Never Completes
Le code fourni démontre la concurrence en récupérant une liste d'URL et en téléchargeant et en enregistrant conditionnellement des fichiers dans le fichier système. La goroutine principale attend que tous les fichiers soient récupérés à l'aide d'un sync.WaitGroup. Cependant, le programme ne parvient pas à se fermer même après avoir terminé toutes les requêtes.
Pour comprendre le problème, considérez la fonctionnalité de WaitGroup. Il tient à jour le décompte des goroutines en cours d'exécution. Si le décompte atteint jamais zéro, le groupe d'attente revient immédiatement, indiquant que toutes les goroutines ont terminé leur exécution.
Dans le code donné, la méthode Add de WaitGroup est utilisée pour incrémenter le décompte, tandis que la méthode Done est utilisée pour le décrémenter. . Si la méthode Add est appelée plus de fois que la méthode Done, ou vice versa, le WaitGroup n'atteindra jamais zéro, ce qui obligera la goroutine principale à attendre indéfiniment.
Il y a deux erreurs dans le code fourni :
func main() { ... go downloadFromURL(url, &wg) ... }
func downloadFromURL(url string, wg *sync.WaitGroup) error { defer wg.Done() ... }
Avec ces corrections en place, le WaitGroup fonctionnera correctement, en décrémentant son décompte à mesure que les goroutines terminent leur tâches, menant finalement à la sortie réussie du goroutine principal.
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!