La routine Go avec Select ne s'arrête que si Fmt.Print() est ajouté
Dans cet exercice Go, nous rencontrons un problème particulier où une goroutine utilisant select ne s'arrête pas jusqu'à ce qu'une instruction fmt.Print() supplémentaire soit introduite. Pour comprendre ce comportement, examinons les mécanismes sous-jacents de la sélection au sein d'une goroutine.
Sans instruction par défaut, sélectionnez les blocs jusqu'à ce qu'il y ait des messages sur tous les canaux. Cependant, une instruction par défaut permet à select d'exécuter une action par défaut si aucun des canaux n'a de message. Dans le code fourni, cette instruction par défaut devient une boucle infinie, consommant le pipeline d'exécution du planificateur.
L'instruction fmt.Print() permet au planificateur de libérer temporairement la goroutine, permettant ainsi à d'autres goroutines de courir. Sans cette version, le planificateur reste bloqué dans la boucle infinie de l'instruction select.
Pour résoudre ce problème, on peut soit supprimer l'instruction par défaut pour rendre la sélection non bloquante, soit introduire un mécanisme de libération temporaire tel que fmt.Print(). De plus, l'utilisation de GOMAXPROCS=2 peut atténuer le problème en augmentant le nombre de threads d'exécution disponibles, mais cette approche ne résout pas complètement le problème.
Notez que les goroutines sont planifiées de manière coopérative, ce qui signifie qu'elles cèdent le contrôle volontairement. On ne sait pas pourquoi l'instruction select ne cède pas dans le code d'origine, bien qu'elle présente une opportunité pour la goroutine de le faire.
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!