Dans une version antérieure de Go, le code ci-dessous présentait un comportement inattendu lorsque runtime.Gosched() était supprimé :
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") }
Sortie avec runtime.Gosched() :
hello world hello world hello world hello world hello
Sortie sans runtime.Gosched() :
hello hello hello hello hello
Lorsque Go est exécuté sans spécifier la variable d'environnement GOMAXPROCS, toutes les goroutines sont planifiées pour être exécutées dans un seul système d'exploitation. fil de discussion. Pour que le programme apparaisse multithread, le planificateur Go doit occasionnellement changer de contexte d'exécution.
Multitâche coopératif :
Go utilise un modèle multitâche coopératif, ce qui signifie que les goroutines doivent explicitement céder le contrôle à d'autres goroutines. Cela contraste avec le multitâche préemptif dans les threads du système d'exploitation, où le planificateur change de contexte d'exécution de manière transparente.
La fonction de runtime.Gosched() :
En l'absence de multitâche préemptif , runtime.Gosched() permet aux goroutines de céder le contrôle au planificateur. Lorsqu'une goroutine atteint un appel Gosched, le planificateur lui demande de basculer l'exécution vers une autre goroutine.
Dans l'exemple fourni, la suppression de Gosched signifie que le contexte d'exécution ne quitte jamais la routine principale. Par conséquent, la goroutine « monde » n'est jamais autorisée à s'exécuter et aucun message « monde » n'est imprimé.
Réglage de GOMAXPROCS sur un nombre positif ( par exemple, runtime.GOMAXPROCS(2)) permet à Go de créer jusqu'à ce nombre de threads natifs. Si GOMAXPROCS est supérieur à 1, les goroutines peuvent être programmées pour s'exécuter dans différents threads, conduisant à un véritable parallélisme.
Avec GOMAXPROCS défini sur 2 ou plus, les goroutines de l'exemple seront entrelacées, même sans exécution.Gosched (), démontrant le multitâche préemptif.
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!