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 :
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!