Gehen Sie Parallelität und Kanal Verwirrung

9

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!

    
SteelwingsJZ 22.08.2013, 21:07
quelle

1 Antwort

4

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:

  1. main erstellt zwei goroutines
  2. Der Scheduler wählt sofort zu einem der neuen Gloutines und wählt display
  3. display gibt die Nachricht aus und wird vom channel send ( c <- true ) blockiert, da noch kein Empfänger vorhanden ist.
  4. Der Scheduler wählt sum next
  5. Die Summe wird berechnet und auf dem Bildschirm gedruckt
  6. Der Scheduler wählt, die sum goroutine nicht fortzusetzen (es hat bereits eine gewisse Zeit gebraucht) und geht weiter mit display
  7. display sendet den Wert an den Kanal
  8. Der Scheduler wählt main next
  9. main quittiert und alle goroutines sind zerstört

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.

    
tux21b 22.08.2013, 22:53
quelle

Tags und Links