Ich bin neu in Go und habe ein Problem, die Nebenläufigkeit und den Kanal zu verstehen.
%Vor%Die Ausgabe des Programms lautet:
%Vor%Aber ich dachte, es sollte nur eine Zeile sein:
%Vor%In der Hauptfunktion blockiert & lt; -c dies und wartet darauf, dass die anderen zwei Routinen Daten an den Kanal senden. Sobald die Hauptfunktion die Daten von c empfängt, sollte sie fortfahren und beenden.
Anzeige und Summe werden gleichzeitig ausgeführt und die Summe dauert länger, daher sollte die Anzeige an c übergeben werden und das Programm sollte beendet werden, bevor die Summe endet ...
Ich bin mir nicht sicher, ob ich das klar verstehe. Könnte mir jemand dabei helfen? Vielen Dank!
Die genaue Ausgabe Ihres Programms ist nicht definiert und hängt vom Scheduler ab. Der Scheduler kann frei zwischen allen nicht blockierten Gououtlines wählen. Es versucht, diese Goroutines gleichzeitig auszuführen, indem die aktuelle Goroutine in sehr kurzen Zeitintervallen umgeschaltet wird, so dass der Benutzer das Gefühl hat, dass alles gleichzeitig passiert. Darüber hinaus kann es auch mehr als eine Goroutine parallel auf verschiedenen CPUs ausführen (wenn Sie ein Multicore-System haben und erhöhen runtime.GOMAXPROCS ). Eine Situation, die zu Ihrer Ausgabe führen könnte, ist:
main
erstellt zwei goroutines display
display
gibt die Nachricht aus und wird vom channel send ( c <- true
) blockiert, da noch kein Empfänger vorhanden ist. sum
next sum
goroutine nicht fortzusetzen (es hat bereits eine gewisse Zeit gebraucht) und geht weiter mit display
display
sendet den Wert an den Kanal Aber das ist nur eine mögliche Ausführungsreihenfolge. Es gibt viele andere und einige von ihnen werden zu einer anderen Ausgabe führen. Wenn Sie nur das erste Ergebnis drucken und danach das Programm beenden möchten, sollten Sie wahrscheinlich result chan string
verwenden und Ihre main
-Funktion ändern, um fmt.Println(<-result)
zu drucken.
Tags und Links concurrency go channel goroutine