Maison  >  Article  >  développement back-end  >  Pourquoi ma Goroutine ne s'exécute-t-elle pas dans mon programme Go ?

Pourquoi ma Goroutine ne s'exécute-t-elle pas dans mon programme Go ?

Patricia Arquette
Patricia Arquetteoriginal
2024-11-02 18:46:02571parcourir

Why Doesn't My Goroutine Execute in My Go Program?

Anomalie d'exécution de Goroutine

Un utilisateur a rencontré une situation déroutante où sa goroutine ne parvient pas à s'exécuter dans son programme Go. Malgré la création d'une goroutine avec une fonction anonyme et l'envoi de messages à un canal au sein de la fonction principale, le résultat attendu de "Entrer dans la goroutine..." est absent.

L'inspection du code fourni révèle que la goroutine est bien créé et passé un pointeur vers le canal de messages. Cependant, le problème réside dans le flux d'exécution ultérieur du programme.

Synchronisation manquante

Le problème crucial est l'absence de synchronisation entre la fonction principale et la goroutine. Le programme se termine après l'impression de "Terminé!", sans fournir aucun mécanisme permettant à la goroutine de continuer à s'exécuter.

Go permet aux goroutines de s'exécuter en même temps que le programme principal. Cependant, si la fonction principale se termine avant que les goroutines n'aient terminé leurs tâches, les goroutines seront terminées prématurément.

Solutions possibles

Pour résoudre ce problème, le programme doit implémenter un mécanisme de synchronisation pour garantir que la fonction principale attend la fin de la goroutine. Ceci peut être réalisé par différentes approches :

  • En attente sur une chaîne : Créez une autre chaîne qui attend un nombre spécifique de messages égal au nombre de goroutines créées. La fonction principale peut bloquer sur ce canal jusqu'à ce que tous les messages aient été reçus, indiquant l'achèvement de toutes les goroutines.
  • sync.WaitGroup : Utilisez un sync.WaitGroup pour suivre le nombre de goroutines actives et décrémentez-le lorsque chaque goroutine est terminée. La fonction principale peut appeler WaitGroup.Wait() pour bloquer jusqu'à ce que le nombre atteigne zéro, garantissant ainsi que toutes les goroutines sont terminées.
  • Instruction Select : Utilisez une instruction select pour attendre une entrée sur les deux le canal de message et un canal "terminé". Lorsqu'un message est reçu du canal de messagerie, traitez-le. Lorsqu'un message est reçu du canal "terminé", fermez le canal de message et quittez la goroutine. La fonction principale peut envoyer un message au canal « terminé » pour signaler la fin du programme.

Exploration plus approfondie

Le blog Go fournit un excellent ressource pour comprendre la concurrence dans Go, qui peut être trouvée sur le lien suivant : [Go Blog : Concurrency](https://blog.golang.org/go-concurrency-patterns).

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