Was ist der beste Weg, um eine parallele Endlosschleife zu erreichen?

9

Ich habe mich daran gewöhnt, Parallel.For () in den parallelen Erweiterungen von .Net zu verwenden, da es eine einfache Art ist, Code zu parallelisieren, ohne manuell Threads starten und warten zu müssen (was fiddly sein kann). Ich schaue jetzt auf eine Endlosschleife (tue etwas, bis ich signalisiere, dass es aufhört), das ich parallelisieren möchte, es gibt keine freie Argument Parallel.For () Überladung, um dies zu tun, also frage mich, was der beste Ansatz hier wäre Sein. Im Prinzip könnte ich einfach etwas tun wie:

%Vor%

Aber ich vermute, dass dies möglicherweise kein erwartetes / effizientes Muster für die Arbeitspartitionierungslogik ist, das (?)

verarbeiten kann

Eine andere Option ist etwas wie:

%Vor%

Aber das scheint unelegant und kann auch zu ineffizienter Arbeitspartitionierung führen.

Im Moment ist mein Instinkt, dies manuell zu tun, indem ich meine eigenen Threads erstelle und pflege, aber ich wäre daran interessiert, einige Rückmeldungen / Meinungen dazu zu bekommen. Danke.

=== UPDATE ===

Ich verwende eine vereinfachte Version des Codes aus dem Artikel in der angenommenen Antwort (Ich habe den ParallelOptions-Parameter entfernt). Hier ist der Code ...

%Vor%

Eine Beispielverwendung wäre:

%Vor%     
redcalx 29.12.2011, 18:26
quelle

3 Antworten

8

Stephen Toub hat einen Beitrag über Implementierung parallel während mit Parallel.ForEach .

    
Rynant 29.12.2011, 18:37
quelle
2

Wenn Sie (wirklich) etwas Unendliches wollen, dann wollen Sie es auf möglichst wenigen Kernen. Keines der Parallel.For___ wäre eine gute Wahl.

Was Sie (wahrscheinlich) benötigen, ist ein separater Thread oder eine Aufgabe, die mit der LongRunning-Option erstellt wurde.

Und dann lassen Sie es auf einen Semaphor warten, oder rufen Sie Sleep () als letzten Ausweg so oft wie möglich.

    
Henk Holterman 29.12.2011 18:30
quelle
1

Wenn man bedenkt, dass es sich um eine Infinit-Kalkül-Anfrage handelt, aber Sie müssen bei jedem "Zyklus" einen finit-Zustand haben, würde ich sagen, dass ich eine Lösung mit einer externen for(;;) -Schleife ändern würde Parallel.ForEach(...) ruft einige Ereignisse / Statusänderungen auf. Wie ein Monitor Signal, event Benachrichtigung, oder so ähnlich ...

    
Tigran 29.12.2011 18:41
quelle