Maison >développement back-end >Golang >Quel est l'impact de `runtime.Gosched()` sur l'exécution du programme Go avant et après Go 1.5 ?
Dans les versions Go antérieures à 1.5, un morceau de code impliquant runtime.Gosched() a été observé pour affecter la sortie d'un programme :
func say(s string) { for i := 0; i < 5; i++ { runtime.Gosched() fmt.Println(s) } } func main() { go say("world") say("hello") }
Sortie avec runtime.Gosched() :
hello world hello world hello world hello world hello
Sortie sans runtime.Gosched() :
hello hello hello hello hello
Dans les versions Go antérieures à 1.5, runtime.Gosched( ) a explicitement cédé le contrôle à d'autres goroutines lorsqu'elles sont appelées. Alors que les programmes Go s'exécutent par défaut sur un seul thread du système d'exploitation, runtime.Gosched() permettait au planificateur de basculer l'exécution entre les goroutines.
Lorsque GOMAXPROCS n'était pas défini ou était défini sur 1, le multitâche coopératif de Go exigeait que les goroutines cèdent explicitement le contrôle. . Ainsi, dans l'exemple de code ci-dessus, la sortie "world" n'apparaissait que lorsque runtime.Gosched() était appelé, car elle permettait au planificateur de basculer vers la goroutine exécutant l'instruction d'impression "world".
Dans Go 1.5 et versions ultérieures, runtime.GOMAXPROCS est défini par défaut sur le nombre de cœurs matériels, ce qui signifie que Go peut créer plusieurs threads de système d'exploitation pour exécuter des goroutines.
Avec GOMAXPROCS défini sur une valeur supérieure à 1, les goroutines peuvent s'exécuter en parallèle. Cependant, contrairement aux systèmes multitâches préemptifs, les goroutines doivent toujours céder explicitement le contrôle pour permettre à d’autres goroutines de s’exécuter. En effet, Go utilise le multitâche coopératif, dans lequel les goroutines cèdent volontairement le contrôle au planificateur.
Avec GOMAXPROCS défini sur une valeur supérieure à 1, le résultat de l'entrelacement des goroutines peut devenir indéterministe. , car le planificateur peut basculer l'exécution entre eux à tout moment. Cela peut conduire à des modèles de sortie imprévisibles, comme le montre l'exemple ci-dessus lorsque GOMAXPROCS était défini sur 2.
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!