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.
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!
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:
num1
generiert eine Zahl, gefolgt von num2
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.
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.
Tags und Links concurrency go channels