Maison >développement back-end >Golang >Pourquoi les Goroutines se bloquent-elles et comment résoudre ce problème ?

Pourquoi les Goroutines se bloquent-elles et comment résoudre ce problème ?

Susan Sarandon
Susan Sarandonoriginal
2024-12-13 15:09:14966parcourir

Why Do Goroutines Block Each Other, and How Can This Be Addressed?

Goroutine bloquant d'autres goroutines

Dans l'extrait de code donné, la première goroutine entre dans une boucle infinie, empêchant la goroutine restante d'envoyer au canal de délai d'attente. Ce comportement est une caractéristique de la planification coopérative dans les goroutines.

Les goroutines cèdent la place au planificateur dans les scénarios suivants :

  • Envoi ou réception vers/depuis des canaux sans tampon
  • Appels système (par exemple, lectures de fichiers ou écritures réseau)
  • Mémoire allocation
  • Appel de time.Sleep()
  • Appel de runtime.Gosched()

Dans ce cas, la boucle infinie dans la première goroutine l'empêche de céder à le planificateur. Par conséquent, l'autre goroutine ne peut pas envoyer au canal de délai d'attente et le programme continue de s'exécuter indéfiniment au lieu de se terminer après une seconde.

Une solution potentielle à ce problème consiste à utiliser un planificateur préemptif au lieu d'un planificateur coopératif. Dans un planificateur préemptif, le système bascule de force entre les goroutines en fonction de leurs priorités. Cependant, Go utilise actuellement un planificateur coopératif.

Une autre stratégie consiste à céder manuellement le pas au planificateur à l'aide de runtime.Gosched(). Cependant, cette technique n'est généralement pas nécessaire dans la plupart des programmes en raison d'une communication suffisante via les canaux ou les E/S du système.

Il est important de noter que définir GOMAXPROCS sur une valeur plus élevée peut ne pas résoudre complètement le problème. Bien qu'il permette à plusieurs goroutines de s'exécuter en parallèle, le garbage collector fonctionne toujours de manière synchrone. Si les goroutines à processeur élevé ne cèdent jamais, le GC peut bloquer indéfiniment les autres goroutines pendant l'exécution.

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