Nim Threadübergabe zwischen Threads: Wie vermeidet man einen globalen TChannel?

9

Ich habe das folgende einfache Beispiel für ein Inter-Thread-Kommunikationsproblem: Ich möchte beliebige "Anytime" -Algorithmen in einem Hintergrund-Thread ausführen. Ein Jederzeitalgorithmus führt inkrementell eine gewisse Berechnung des Ergebnistyps T durch, d.h. er erzeugt sporadisch neuere, genauere Ergebnisse. Im Nim-Sprachgebrauch werden sie wahrscheinlich am besten durch einen Iterator dargestellt. Im Hauptthread möchte ich nun solche Iteratoren jeweils in einen eigenen Thread einbinden, mit der Möglichkeit, die Threads nach Dingen wie "Gibt es einen neuen Wert verfügbar" oder "Was ist das aktuelle Berechnungsergebnis?" Abzufragen.

Da ich mit Nim's Concurrency-Konzepten nicht vertraut bin, habe ich Probleme, die erforderliche Inter-Thread-Kommunikation zu implementieren. Meine Idee war, ein TChannel für die Kommunikation zu verwenden. Laut diesem Forenbeitrag kann ein TChannel nicht in Kombination mit spawn verwendet werden, sondern erfordert% Code%. Ich habe Folgendes zum Kompilieren und Ausführen bekommen:

%Vor%

Leider hat dies nicht das erwartete Verhalten, d. h. ich erhalte nie etwas im Hauptthread. Mir wurde im IRC gesagt, dass das Problem ist, dass ich keine globalen Variablen verwende. Aber selbst nach langer Zeit sehe ich weder genau, warum das scheitert, noch ob es einen Weg gibt, es zu lösen. Das Problem ist, dass ich die Variablen createThread und thread global nicht einfach machen kann, da sie vom Typ channel abhängen. Ich möchte auch vermeiden, dies zu beschränken, um nur einen einzigen Always-Always-Algorithmus (oder irgendeine andere feste Zahl N) auszuführen. Mir wurde auch gesagt, dass der Ansatz insgesamt keinen Sinn ergibt, also fehlt mir vielleicht gerade, dass dieses Problem eine ganz andere Lösung hat?

    
bluenote10 29.04.2015, 18:46
quelle

1 Antwort

3

Grund:

Sie verwenden zwei verschiedene Kanäle in send und recv .

Objekt Zuweisung in Nim ist tiefe Kopie, sie sind verschiedene Objekte.

%Vor%

und

%Vor%

Um es zu erklären, sehen Sie sich das Code-Snippet an:

%Vor%

Lösung, um Kanal ein- und auszugeben proc:

Um Kanal als Parameter und Rückgabewert zu übergeben, beziehen Sie sich bitte auf Jehans Antwort im Nim-Forum .

fügen Sie Jehans Antwort hier für eine schnelle Referenz ein und lassen Sie sie in Nim 0.11.2 kompilieren.

%Vor%

Ausgabe:

%Vor%

Noch ein Schritt, Lösung für diese Frage:

%Vor%     
Roger 28.08.2015, 07:18
quelle

Tags und Links