Golang sync.WaitGroup ne se termine jamais : une histoire de débogage
Dans la programmation simultanée, la gestion gracieuse de la terminaison des goroutines est cruciale. Le sync.WaitGroup vous permet de suivre l'achèvement de plusieurs tâches et d'attendre qu'elles soient toutes terminées. Cependant, si votre WaitGroup ne semble jamais se terminer, il peut y avoir des problèmes sous-jacents.
L'un de ces problèmes est l'utilisation incorrecte des méthodes Add et Done. Dans le code donné, où nous récupérons et téléchargeons simultanément des fichiers, les méthodes Add et Done ne sont pas utilisées correctement. Pour garantir que le WaitGroup est correctement mis à jour, il est essentiel de transmettre un pointeur vers le WaitGroup à la goroutine plutôt qu'une copie.
func main() { ... go downloadFromURL(url, &wg) ... }
Un autre problème survient lorsque l'appel wg.Done() n'est pas placé comme l'une des premières déclarations de la goroutine. Si une erreur se produit dans la goroutine et que la fonction revient prématurément, l'appel wg.Done() risque de ne pas être exécuté.
func downloadFromURL(url string, wg *sync.WaitGroup) error { defer wg.Done() ... }
En plaçant l'appel wg.Done() comme première instruction, nous nous assurons qu'il est toujours exécuté quelles que soient les erreurs ultérieures. Cette modification garantit que le WaitGroup est correctement décrémenté et que la goroutine principale peut détecter la fin de tous les téléchargements de fichiers, empêchant ainsi le programme de se bloquer indéfiniment.
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!