Heim >Backend-Entwicklung >Golang >Wie wirkt sich „runtime.Gosched()' auf die Go-Programmausführung vor und nach Go 1.5 aus?

Wie wirkt sich „runtime.Gosched()' auf die Go-Programmausführung vor und nach Go 1.5 aus?

Susan Sarandon
Susan SarandonOriginal
2024-12-30 14:37:16783Durchsuche

How Does `runtime.Gosched()` Impact Go Program Execution Before and After Go 1.5?

Wie sich Gosched auf die Ausführung von Go-Programmen auswirkt

Problem

In Go-Versionen vor 1.5 ein Codeabschnitt, der runtime.Gosched() beinhaltet Es wurde beobachtet, dass es die Ausgabe eines Programms beeinflusst:

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

Erklärung

In Go-Versionen vor 1.5 ist runtime.Gosched( ) übergab beim Aufruf explizit die Kontrolle an andere Goroutinen. Während Go-Programme standardmäßig auf einem einzelnen Betriebssystem-Thread ausgeführt werden, ermöglichte runtime.Gosched() dem Scheduler, die Ausführung zwischen Goroutinen zu wechseln.

Als GOMAXPROCS deaktiviert oder auf 1 gesetzt war, erforderte das kooperative Multitasking von Go, dass Goroutinen explizit die Kontrolle abgeben . Daher erschien im obigen Codebeispiel die „world“-Ausgabe nur, wenn runtime.Gosched() aufgerufen wurde, da sie es dem Scheduler ermöglichte, zur Goroutine zu wechseln, die die „world“-Druckanweisung ausführte.

GOMAXPROCS und Kooperatives Multitasking

In Go 1.5 und höher ist runtime.GOMAXPROCS standardmäßig auf die Anzahl der Hardwarekerne eingestellt, was bedeutet, dass Go mehrere Betriebssystem-Threads erstellen kann Goroutinen ausführen.

Wenn GOMAXPROCS auf einen Wert größer als 1 eingestellt ist, können Goroutinen parallel ausgeführt werden. Anders als in präventiven Multitasking-Systemen müssen Goroutinen jedoch immer noch explizit die Kontrolle abgeben, damit andere Goroutinen ausgeführt werden können. Dies liegt daran, dass Go kooperatives Multitasking verwendet, bei dem Goroutinen freiwillig die Kontrolle an den Scheduler abgeben.

Auswirkungen auf Parallelität

Wenn GOMAXPROCS auf einen Wert größer als 1 eingestellt ist, kann das Ergebnis der Verschachtelung von Goroutinen unbestimmt werden , da der Scheduler die Ausführung jederzeit zwischen ihnen wechseln kann. Dies kann zu unvorhersehbaren Ausgabemustern führen, wie im obigen Beispiel zu sehen ist, als GOMAXPROCS auf 2 gesetzt wurde.

Das obige ist der detaillierte Inhalt vonWie wirkt sich „runtime.Gosched()' auf die Go-Programmausführung vor und nach Go 1.5 aus?. 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