Goroutines et planification coopérative
Les goroutines, les processus simultanés légers de Go, utilisent la planification coopérative, ce qui signifie qu'ils s'appuient sur le fait de céder volontairement l'exécution à d'autres goroutines. Cependant, des inquiétudes ont été soulevées quant au fait que cette approche pourrait conduire à la famine d'autres goroutines si une goroutine boucle continuellement sans céder.
Exemple de code
Considérez l'extrait de code suivant : où plusieurs goroutines sont utilisées pour effectuer une opération en boucle :
// sum function repeatedly adds numbers up to a specified limit func sum(x int) { sum := 0 for i := 0; i < x; i++ { sum += i } fmt.Println(sum) } // Start four goroutines, each performing the sum operation with different inputs func main() { go sum(100) go sum(200) go sum(300) go sum(400) }
Famine Scénario
Si un seul thread est disponible, comme suggéré dans la question, il est possible que l'une des goroutines entre dans une boucle infinie, empêchant les autres goroutines de s'exécuter. Cette situation est connue sous le nom de famine.
Le rendement coopératif chez les Goroutines
La famine des Goroutines peut être résolue par le biais du rendement coopératif, où les goroutines cèdent explicitement l'exécution à d'autres goroutines via des mécanismes tels que opérations de canal ou blocage sur les primitives dans le package de synchronisation.
Dans le contexte de l'exemple de code, imprimer le sum en utilisant fmt.Println(sum) dans la fonction sum déclenche un appel de fonction, qui appelle le planificateur d'exécution. Ce planificateur peut choisir de passer à un autre goroutine, introduisant ainsi une opportunité pour d'autres goroutines de s'exécuter.
Approche de planification alternative
Récemment, des propositions ont été faites au sein du runtime Go pour insérer automatiquement les appels du planificateur dans des boucles étroites ou dans d'autres situations où une famine de goroutine peut survenir. Cette approche atténuerait davantage les problèmes de famine.
Conclusion
La planification coopérative dans les goroutines nécessite l'abandon explicite de l'exécution pour éviter la famine. Les appels de fonction et les opérations spécifiques offrent au planificateur d'exécution la possibilité de basculer entre les goroutines. Les développements futurs du runtime pourraient automatiser encore davantage ce processus.
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!