Heim  >  Artikel  >  Backend-Entwicklung  >  Warum druckt mein Go-Programm manchmal das Summenergebnis vor der „ersten Meldung anzeigen“?

Warum druckt mein Go-Programm manchmal das Summenergebnis vor der „ersten Meldung anzeigen“?

DDD
DDDOriginal
2024-10-30 18:16:03726Durchsuche

 Why does my Go program sometimes print the sum result before the

Go-Parallelität und Kanalverwirrung: Goroutine-Ausführungsreihenfolge verstehen

In Go wird Parallelität durch Goroutinen erreicht, leichte Threads, die gleichzeitig innerhalb eines ausgeführt werden Einzelprozess. Kanäle bieten eine Möglichkeit zur Kommunikation zwischen Goroutinen. Allerdings kann es insbesondere für Anfänger eine Herausforderung sein, zu verstehen, wie Goroutinen und Kanäle interagieren.

In diesem Artikel geht es um einen häufigen Verwirrungspunkt im Zusammenhang mit der Ausführungsreihenfolge von Goroutinen und der Kanalkommunikation. Das Beispielprogramm stellte Folgendes bereit:

<code class="go">package main

import "fmt"

func display(msg string, c chan bool) {
    fmt.Println("display first message:", msg)
    c <- true
}

func sum(c chan bool) {
    sum := 0
    for i := 0; i < 10000000000; i++ {
        sum++
    }
    fmt.Println(sum)
    c <- true
}

func main() {
    c := make(chan bool)

    go display("hello", c)
    go sum(c)
    <-c
}</code>

Von diesem Programm wird erwartet, dass es als erste Ausgabe „erste Nachricht anzeigen: Hallo“ ausgibt, gefolgt vom Ergebnis der Summenberechnung. In einigen Fällen ist die Summenberechnung jedoch abgeschlossen, bevor die Anzeigefunktion Daten an den Kanal sendet.

Erklärung:

Der Scheduler in Go bestimmt die Reihenfolge, in der Goroutinen ausgeführt werden werden ausgeführt. Es ist nicht deterministisch, was bedeutet, dass die Ausführungsreihenfolge je nach Faktoren wie Hardware und Betriebssystem variieren kann. In diesem Beispiel:

  1. Die Hauptfunktion erstellt zwei Goroutinen: Anzeige und Summe.
  2. Der Planer wechselt zuerst zur Anzeige-Goroutine, die die Zeile „Erste Nachricht anzeigen“ ausgibt .
  3. Die Anzeige-Goroutine wird blockiert, wenn sie versucht, Daten an den Kanal zu senden (c <- true), da noch kein Empfänger vorhanden ist.
  4. Der Scheduler entscheidet sich für die Ausführung der Summen-Goroutine. Dadurch wird die rechenintensive Schleife ausgeführt.
  5. Sobald die Summenberechnung abgeschlossen ist, sendet die Summen-Goroutine Daten an den Kanal.
  6. Die Hauptfunktion empfängt die Daten vom Kanal und wird beendet.

Es ist jedoch auch möglich, dass der Scheduler die Summen-Goroutine vollständig ausführt, bevor die Anzeige-Goroutine Daten an den Kanal sendet. In diesem Fall wäre die Ausgabe:

10000000000
display first message: hello

Lösung:

Um sicherzustellen, dass die Anzeigemeldung vor dem Summenergebnis gedruckt wird, kann man ein Ergebnis verwenden Kanal, um das erste Ergebnis zu empfangen und das Programm zu verlassen. Die geänderte Hauptfunktion wäre:

<code class="go">func main() {
    result := make(chan string)

    go display("hello", result)
    go sum(result)
    fmt.Println(<-result)
}</code>

Das obige ist der detaillierte Inhalt vonWarum druckt mein Go-Programm manchmal das Summenergebnis vor der „ersten Meldung anzeigen“?. 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