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:
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!