Heim >Backend-Entwicklung >Golang >Wie verhalten sich Goroutinen zwischen Go-Playground und lokaler Maschine unterschiedlich?

Wie verhalten sich Goroutinen zwischen Go-Playground und lokaler Maschine unterschiedlich?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-10-23 17:42:24534Durchsuche

How Do Goroutines Behave Differently Between Go Playground and Local Machine?

Diskrepanzen zwischen Go Playground und Go auf meinem lokalen Computer

Problem: Goroutinen in Go Playground im Vergleich zum lokalen Computer

Um Missverständnisse über Goroutinen zu klären, Dieser Code wurde im Go Playground ausgeführt:

<code class="go">package main

import (
    "fmt"
)

func other(done chan bool) {
    done <- true
    go func() {
        for {
            fmt.Println("Here")
        }
    }()
}

func main() {
    fmt.Println("Hello, playground")
    done := make(chan bool)
    go other(done)
    <-done
    fmt.Println("Finished.")
}</code>

Im Go Playground führte er zu einem Fehler: „Der Vorgang hat zu lange gedauert.“ Dies deutet darauf hin, dass die Goroutine, die in anderen erstellt wurde, auf unbestimmte Zeit läuft.

Die lokale Ausführung desselben Codes erzeugte jedoch die sofortige Ausgabe:

<code class="go">Hello, playground.
Finished.</code>

Dies impliziert, dass die Goroutine in anderen Programmen beendet wird, wenn die Haupt-Goroutine ausgeführt wird wird beendet.

Erklärung

Die Ungleichheit ist auf den Standardwert von GOMAXPROCS zurückzuführen.

Auf dem Go-SpielplatzGOMAXPROCS ist auf 1 gesetzt. Dies bedeutet, dass jeweils nur eine Goroutine ausgeführt werden kann. Wenn die in anderen Goroutinen erstellte Goroutine nicht blockiert (z. B. durch Warten auf einen Kanal), wechselt der Scheduler nicht zu anderen Goroutinen.

Da die Haupt-Goroutine auf dem fertigen Kanal blockiert, wechselt der Scheduler zu Goroutine in anderen. Dann startet die Goroutine in anderen eine weitere Goroutine mit einer Endlosschleife. Da GOMAXPROCS 1 ist, wird die Haupt-Goroutine nicht fortgesetzt und die Endlosschleife läuft weiter, was zu einer Zeitüberschreitung führt.

Auf dem lokalen Computer verwendet GOMAXPROCS normalerweise standardmäßig die Anzahl der CPU-Kerne (z. B. 4 oder 8). Dadurch können mehrere Goroutinen gleichzeitig ausgeführt werden. Wenn die Haupt-Goroutine den Kanal „Fertig“ blockiert, wechselt der Planer zu einer anderen Goroutine. Dies könnte die Goroutine in anderen sein oder die Goroutine, die die Endlosschleife ausführt.

Da die Haupt-Goroutine irgendwann beendet wird, wird die Endlosschleife nicht mehr ausgeführt. Daher wird das Programm normal beendet, ohne auf den Abschluss der Endlosschleife zu warten.

Fazit

Beim Ausführen von Goroutinen im Go Playground ist es wichtig, den Standardwert von GOMAXPROCS zu berücksichtigen. Um die Parallelität mehrerer Goroutinen zu simulieren, legen Sie GOMAXPROCS explizit auf einen höheren Wert fest, z. B. runtime.GOMAXPROCS(2). Bei der lokalen Ausführung ermöglicht die Standardeinstellung von GOMAXPROCS normalerweise das erwartete Parallelitätsverhalten.

Das obige ist der detaillierte Inhalt vonWie verhalten sich Goroutinen zwischen Go-Playground und lokaler Maschine unterschiedlich?. 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