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

DDD
Freigeben: 2024-10-30 18:16:03
Original
738 Leute haben es durchsucht

 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>
Nach dem Login kopieren

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
Nach dem Login kopieren

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>
Nach dem Login kopieren

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!

Quelle:php.cn
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
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!