Maison >développement back-end >Golang >Quel est l'impact de « runtime.Gosched() » sur l'exécution de Goroutine dans Go ?

Quel est l'impact de « runtime.Gosched() » sur l'exécution de Goroutine dans Go ?

Linda Hamilton
Linda Hamiltonoriginal
2024-12-22 05:18:14404parcourir

How Does `runtime.Gosched()` Impact Goroutine Execution in 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 :

  • La goroutine actuelle met son exécution en pause.
  • Le planificateur évalue quelle goroutine est programmé pour s'exécuter ensuite en fonction de son algorithme de planification et des contraintes du système.
  • Le prochain goroutine planifié reprend l'exécution.

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!

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