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 ?

Quel est l'impact de `runtime.Gosched()` sur l'exécution du programme Go avant et après Go 1.5 ?

Susan Sarandon
Susan Sarandonoriginal
2024-12-30 14:37:16783parcourir

How Does `runtime.Gosched()` Impact Go Program Execution Before and After Go 1.5?

Comment Gosched affecte l'exécution des programmes Go

Problème

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

Explication

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".

GOMAXPROCS et Multitâche coopératif

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.

Implications pour le parallélisme

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn