Maison > développement back-end > Golang > Pourquoi `runtime.Gosched()` est-il crucial pour l'entrelacement de la sortie Goroutine dans les programmes Go mono-thread ?

Pourquoi `runtime.Gosched()` est-il crucial pour l'entrelacement de la sortie Goroutine dans les programmes Go mono-thread ?

DDD
Libérer: 2024-12-21 12:30:10
original
224 Les gens l'ont consulté

Why is `runtime.Gosched()` Crucial for Interleaving Goroutine Output in Single-Threaded Go Programs?

Pourquoi Runtime.Gosched() est-il nécessaire pour l'entrelacement de la sortie ?

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")
}
Copier après la connexion

Sortie avec runtime.Gosched() :

hello
world
hello
world
hello
world
hello
world
hello
Copier après la connexion

Sortie sans runtime.Gosched() :

hello
hello
hello
hello
hello
Copier après la connexion

Comprendre le rôle de runtime.Gosched()

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

GOMAXPROCS : Spécification du nombre de threads

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!

source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal