Maison >développement back-end >Golang >Quel est l'impact de « runtime.Gosched() » sur l'exécution de Goroutine dans Go ?
runtime.Gosched : contrôle du rendement pour le multitâche coopératif
Dans Go, la fonction runtime.Gosched abandonne explicitement le contrôle de la goroutine actuelle, permettant au planificateur pour basculer l'exécution vers un autre goroutine. Ce mécanisme est crucial pour le multitâche coopératif employé par le runtime de Go, permettant aux goroutines de partager le temps CPU sans compter sur la préemption des threads au niveau du système d'exploitation.
Considérez l'extrait de code suivant :
package main import ( "fmt" "runtime" ) func say(s string) { for i := 0; i < 5; i++ { runtime.Gosched() fmt.Println(s) } } func main() { go say("world") say("hello") }
Dans Dans cet exemple, deux goroutines sont créées : la goroutine principale et une deuxième goroutine chargée d'imprimer "world". Sans runtime.Gosched(), la goroutine principale s'exécuterait en continu sans céder le contrôle à l'autre goroutine, ce qui donnerait le résultat :
hello hello hello hello hello
Cependant, avec runtime.Gosched(), le planificateur bascule l'exécution entre les deux. goroutines à chaque itération, produisant une sortie entrelacée :
hello world hello world hello world hello world hello
Pourquoi runtime.Gosched() Affecte l'exécution
Lorsque runtime.Gosched() est appelé, ce qui suit se produit :
Le multitâche coopératif repose sur des goroutines qui cèdent explicitement le contrôle via des mécanismes comme runtime.Gosched() ou en utilisant des primitives de concurrence comme les canaux. En revanche, le multitâche préemptif, tel qu'employé par la plupart des systèmes d'exploitation modernes, change de manière transparente les contextes d'exécution entre les threads sans l'implication des goroutines.
GOMAXPROCS et exécution
La variable d'environnement GOMAXPROCS contrôle le nombre maximum de threads du système d'exploitation que le runtime Go peut utiliser pour l'exécution de la goroutine. Lorsque GOMAXPROCS est défini sur 0 (par défaut) ou 1, le runtime utilise un seul thread. Dans ce scénario, runtime.Gosched() devient essentiel pour que les goroutines coopèrent et partagent le temps CPU.
Si GOMAXPROCS est défini sur une valeur supérieure à 1, le runtime peut créer plusieurs threads de système d'exploitation. Dans ce cas, les goroutines peuvent s'exécuter simultanément sur différents threads, réduisant ainsi le besoin de rendement explicite. Par conséquent, runtime.Gosched() peut avoir moins d'impact sur 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!