Les goroutines donnent des points au-delà des appels système
Dans les programmes Go, les goroutines sont le principal mécanisme de concurrence. Bien que les appels système qui bloqueraient une goroutine soient des seuils de rendement connus, la compréhension de la planification des goroutines n'est pas complète sans considérer d'autres seuils de rendement possibles.
Un point de rendement suspecté concerne les appels de fonction, car ils nécessitent que le planificateur vérifie la pile. croissance. Cependant, il a été déclaré qu '"une goroutine verrouillera le thread jusqu'à ce qu'il quitte ou frappe quelque chose qui pourrait donner lieu à l'exécution par d'autres" s'il effectue uniquement des opérations mathématiques.
Pour tester cela, un programme a été créé qui s'exécute trois boucles (une dans la fonction principale et deux dans des goroutines séparées) sans aucun appel de fonction. Le programme définit GOMAXPROCS sur 1, limitant le nombre de threads du système d'exploitation pouvant exécuter du code Go simultanément. Cependant, la sortie affiche toujours des messages entrelacés de la fonction principale et des goroutines, ce qui suggère que les goroutines cèdent le contrôle même sans appels de fonction.
La réponse à cette divergence apparente réside dans la préemption asynchrone introduite dans Go 1.14, qui ajoute du potentiel. points de préemption presque partout. Par conséquent, les goroutines peuvent céder le contrôle à divers moments autres que le blocage des appels système.
Bien que l'implémentation exacte des points de préemption puisse changer entre les versions de Go, la préemption asynchrone garantit que les boucles sans appels de fonction ne bloquent plus le planificateur ou ne retardent pas considérablement les déchets. collection. Néanmoins, il est important de noter que les écritures de tableau non synchronisées et les mises à jour d'index non atomiques peuvent introduire des points de planification coopérative susceptibles d'avoir un impact sur le comportement du programme.
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!