Maison  >  Article  >  développement back-end  >  Pourquoi les applications Go se bloquent-elles lors de l'utilisation de groupes d'attente et de canaux ?

Pourquoi les applications Go se bloquent-elles lors de l'utilisation de groupes d'attente et de canaux ?

DDD
DDDoriginal
2024-10-26 08:19:02777parcourir

Why Do Go Applications Hang When Using WaitGroups and Channels?

Fermeture des canaux pour une sortie propre dans les applications Go à l'aide de WaitGroups

Cet article examine un problème courant rencontré lors de l'utilisation de sync.WaitGroup et des canaux dans Go programmes, qui peuvent empêcher la fonction principale de se fermer une fois que toutes les goroutines ont terminé leurs tâches. Explorons le problème et sa solution.

Le problème : attente infinie

Dans l'exemple fourni, la fonction principale utilise un sync.WaitGroup et un canal (fetchedSymbols) pour gérer des goroutines simultanées qui récupèrent et enregistrent les cotations boursières. Pendant que les goroutines accomplissent leurs tâches, le programme se bloque indéfiniment sans quitter.

Le problème : canal non fermé

Le coupable est la boucle de plage dans la fonction principale . L'itération sur le canal fetchedSymbols bloque la progression car le canal n'est jamais fermé. En conséquence, la fonction principale attend indéfiniment que de nouvelles valeurs soient envoyées via le canal, même si toutes les valeurs ont déjà été reçues.

La solution : fermer le canal

Pour résoudre ce problème, il est crucial de fermer le canal fetchedSymbols une fois que toutes les goroutines ont terminé leurs tâches. Cela signale à la boucle de plage qu'il n'y a plus de valeurs à recevoir, permettant à l'itération de se terminer et à la fonction principale de continuer.

Une approche consiste à utiliser la méthode Wait de sync.WaitGroup pour signaler quand tout les goroutines sont terminées. Une goroutine peut être lancée pour attendre que le WaitGroup atteigne zéro puis fermer le canal.

<code class="go">go func() {
    wg.Wait()
    close(fetchedSymbols)
}()</code>

Avec cette modification, la boucle de plage dans la fonction principale finira par atteindre la fin du canal, permettant au programme pour imprimer le message « terminé » et quitter correctement.

En comprenant l'importance de fermer les canaux lorsqu'ils travaillent avec sync.WaitGroup, les développeurs Go peuvent garantir que leurs applications se terminent de manière prévisible après l'exécution de tâches simultané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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn