Lesen von mehreren Kanälen gleichzeitig in Golang

8

Ich bin neu in Golang. Im Moment versuche ich herauszufinden, wie man einen Any-to-One-Kanal in Golang erstellt, wo das Setup wie folgt aussieht:

sagen, ich habe zwei goroutines numgen1 und numgen2 gleichzeitig ausgeführt und schreiben Zahlen auf Kanäle num1 resp. Nummer2. Ich möchte die Zahlen, die von numgen1 und numgen2 in einem neuen Prozess, Addnum gesendet werden, hinzufügen. Ich habe so etwas versucht:

%Vor%

Aber das scheint leider falsch zu sein. Könnte mir bitte jemand ein paar Ideen geben?

Vielen Dank für Ihre Hilfe.

    
Jing 15.12.2013, 09:33
quelle

3 Antworten

8

Abhängig von Ihren Anforderungen müssen Sie möglicherweise beide der Kanäle für jede Iteration lesen (d. h. eine Art von Zip-Funktion). Sie können dies mit einem select tun, ähnlich wie bei user860302 :

%Vor%

Das läuft für immer. Meine bevorzugte Methode zum Beenden von Gououtines wie diesem ist das Schließen der Eingabekanäle. In diesem Fall müssen Sie warten, bis beide schließen, und dann close(out) vor dem Beenden.

Tipp: Beachten Sie die Verwendung von direktionalen Kanälen als formale Eckparameter. Der Compiler fängt mehr Fehler auf, wenn Sie ihn so schreiben. Glück!

    
Rick-777 16.12.2013, 09:43
quelle
4

Die einfachste Antwort wäre

%Vor%

Da Sie sowohl num1 als auch num2 benötigen, um die Berechnung durchzuführen, macht es keinen Sinn, dies anders zu machen. Immerhin gibt es zwei mögliche Ausführungsbefehle:

  1. num1 generiert eine Zahl, gefolgt von num2
  2. num2 generiert eine Zahl, gefolgt von num1

Im ersten Fall entsprechen unsere Kanallesevorgänge exakt der Ausführungsreihenfolge. Im zweiten Fall wird unser erster Lesevorgang blockiert, bis num1 schließlich eine Zahl erzeugt hat. Der zweite Lesevorgang wird nahezu augenblicklich abgeschlossen, da der Kanal num2 bereits eine Nummer hat.

Wenn Sie mehr über Kanäle in Go erfahren möchten, sollten Sie sich Ссылка ansehen - Dies ist eine Sammlung von Hoares CSP-Beispielen, die in Go geschrieben wurden.

    
publysher 15.12.2013 09:47
quelle
2

Beantworten Sie die Frage "Gleichzeitiges Lesen von mehreren Kanälen"

Es gibt eine Möglichkeit, mehrere Kanäle gleichzeitig zu hören:

%Vor%

In diesem Beispiel erstelle ich einen Kanal msg1 und msg2. Dann erstelle ich eine Go-Routine mit einer Endlosschleife. In dieser Schleife höre ich msg1 AND msg2. Dieses System ermöglicht es Ihnen, gleichzeitig mehrere Kanäle zu lesen und die Nachrichten beim Eintreffen zu verarbeiten.

Um Lecks zu vermeiden, sollte ich wahrscheinlich einen weiteren Kanal hinzufügen, um die Goroutine zu stoppen.

    
user860302 16.12.2013 00:19
quelle

Tags und Links