Heim >Backend-Entwicklung >Golang >Warum ist „runtime.Gosched()' für die Verschachtelung der Goroutine-Ausgabe in Single-Threaded-Go-Programmen von entscheidender Bedeutung?

Warum ist „runtime.Gosched()' für die Verschachtelung der Goroutine-Ausgabe in Single-Threaded-Go-Programmen von entscheidender Bedeutung?

DDD
DDDOriginal
2024-12-21 12:30:10224Durchsuche

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

Warum ist Runtime.Gosched() für die Interleaving-Ausgabe notwendig?

In einer früheren Version von Go zeigte der folgende Code unerwartetes Verhalten, wenn runtime.Gosched() war entfernt:

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")
}

Ausgabe mit runtime.Gosched():

hello
world
hello
world
hello
world
hello
world
hello

Ausgabe ohne runtime.Gosched():

hello
hello
hello
hello
hello

Die Rolle von runtime.Gosched() verstehen

Wenn Go ohne Angabe der Umgebungsvariablen GOMAXPROCS ausgeführt wird, werden alle Goroutinen für die Ausführung in einem einzigen Betriebssystem geplant Faden. Damit das Programm als Multithread-Programm erscheint, muss der Go-Scheduler gelegentlich den Ausführungskontext wechseln.

Kooperatives Multitasking:

Go verwendet ein kooperatives Multitasking-Modell, was bedeutet, dass Goroutinen explizit die Kontrolle abgeben müssen zu anderen Goroutinen. Dies steht im Gegensatz zum präemptiven Multitasking in Betriebssystem-Threads, bei denen der Scheduler die Ausführungskontexte transparent wechselt.

Die Funktion von runtime.Gosched():

In Abwesenheit von präemptivem Multitasking Mit runtime.Gosched() können Goroutinen die Kontrolle an den Scheduler übergeben. Wenn eine Goroutine einen Gosched-Aufruf erreicht, weist der Scheduler sie an, die Ausführung auf eine andere Goroutine umzustellen.

Im bereitgestellten Beispiel bedeutet das Entfernen von Gosched, dass der Ausführungskontext die Hauptroutine nie verlässt. Infolgedessen darf die „Welt“-Goroutine niemals ausgeführt werden und es werden keine „Welt“-Meldungen gedruckt.

GOMAXPROCS: Anzahl der Threads angeben

GOMAXPROCS auf eine positive Zahl setzen ( Beispielsweise ermöglicht runtime.GOMAXPROCS(2)) Go, bis zu dieser Anzahl nativer Threads zu erstellen. Wenn GOMAXPROCS größer als 1 ist, können Goroutinen so geplant werden, dass sie in verschiedenen Threads ausgeführt werden, was zu echter Parallelität führt.

Wenn GOMAXPROCS auf 2 oder höher eingestellt ist, werden die Goroutinen im Beispiel auch ohne runtime.Gosched verschachtelt () und demonstriert präventives Multitasking.

Das obige ist der detaillierte Inhalt vonWarum ist „runtime.Gosched()' für die Verschachtelung der Goroutine-Ausgabe in Single-Threaded-Go-Programmen von entscheidender Bedeutung?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn