Heim > Backend-Entwicklung > Golang > Warum unterscheidet sich das Go-Goroutine-Verhalten zwischen dem Spielplatz und der lokalen Ausführung?

Warum unterscheidet sich das Go-Goroutine-Verhalten zwischen dem Spielplatz und der lokalen Ausführung?

DDD
Freigeben: 2024-10-23 14:35:33
Original
493 Leute haben es durchsucht

Why Do Go Goroutine Behaviors Differ Between the Playground and Local Execution?

Nicht übereinstimmendes Verhalten zwischen Go Playground und lokaler Maschinenausführung

Hintergrund

Um Missverständnisse in Bezug auf Goroutinen zu klären, wandte sich ein Benutzer an Go Playground und den folgenden Code 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>
Nach dem Login kopieren

Beobachtete Ergebnisse

Go Playground:

  • Es ist ein Fehler aufgetreten: „Der Vorgang hat zu lange gedauert ."
  • Impliziert, dass die Goroutine in anderen ständig läuft.

Lokale Ausführung:

  • Fast eine Ausgabe produziert sofort:

    Hello, playground.
    Finished.
    Nach dem Login kopieren
  • Gibt an, dass die Goroutine in anderen nach Abschluss der Haupt-Goroutine beendet wird.

Erklärung

Go Playground:

  • Standardmäßig ist GOMAXPROCS auf 1 gesetzt.
  • Es wird jeweils nur eine Goroutine gleichzeitig ausgeführt, wodurch verhindert wird, dass der Scheduler wechselt, wenn Goroutinen nicht blockieren.
  • Die Haupt-Goroutine blockiert das Warten auf eine Nachricht vom Kanal „Fertig“.
  • Die Goroutine in anderen wird auf unbestimmte Zeit ausgeführt, was zu einer Zeitüberschreitung führt.

Lokale Ausführung:

  • GOMAXPROCS ist wahrscheinlich auf die Anzahl der CPU-Kerne eingestellt, normalerweise auf einen Wert größer als 1.
  • Der Scheduler wechselt zwischen Goroutinen, sodass die Haupt-Goroutine auch bei Nicht-Kernen fortfahren kann -Blockieren der gleichzeitig laufenden Goroutine.
  • Sobald main() beendet wird, wird das Programm beendet, ohne auf den Abschluss der auf unbestimmte Zeit laufenden Goroutine zu warten.

Nichtdeterministisches Verhalten

Beachten Sie, dass der Go Playground derzeit eine zwischengespeicherte Version der Ausgabe verwendet, sodass nachfolgende Läufe möglicherweise nicht genau die tatsächliche Ausführung widerspiegeln.

Fazit

Das Verständnis der Auswirkungen von GOMAXPROCS auf die Goroutine-Ausführung ist für das Design von entscheidender Bedeutung geeignete Parallelitätsmodelle. Die Standardeinstellungen auf dem Go Playground ahmen möglicherweise nicht immer das Verhalten eines lokalen Computers nach, was die Bedeutung des Testens unter verschiedenen Konfigurationen unterstreicht.

Das obige ist der detaillierte Inhalt vonWarum unterscheidet sich das Go-Goroutine-Verhalten zwischen dem Spielplatz und der lokalen Ausführung?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage