Junior — Middle
Comment le changement d'exécution entre différentes goroutines est-il effectué dans le langage Go?
sobes.tech IA
Réponse de l'IA
Dans le langage Go, le changement d'exécution entre goroutines est effectué par le planificateur du runtime Go, qui implémente le modèle M:N — un ensemble de goroutines (M) planifiées sur un ensemble de threads système (N).
Le planificateur Go fonctionne de manière coopérative et préemptive :
- Une goroutine peut céder explicitement le contrôle en appelant
runtime.Gosched(), ce qui permet à d'autres goroutines de s'exécuter. - Le planificateur peut interrompre une goroutine à certains points (par exemple, lors d'appels bloquants, d'appels système, d'opérations d'entrée/sortie).
- Le runtime de Go change automatiquement le contexte entre les goroutines, en sauvegardant leur état (pile, registres).
Ainsi, le changement entre goroutines se produit à l'intérieur du runtime de Go, et le programmeur ne le contrôle généralement pas directement.
Exemple de cession explicite du contrôle :
goroutine1 := func() {
for i := 0; i < 5; i++ {
fmt.Println("Goroutine 1 -", i)
runtime.Gosched() // céder l'exécution à d'autres goroutines
}
}
func main() {
go goroutine1()
for i := 0; i < 5; i++ {
fmt.Println("Goroutine principale -", i)
}
}
Ici, runtime.Gosched() permet de passer à d'autres goroutines.