Was ist der beste Weg, um ein parallel-Endlosschleife?
Habe ich genutzt, um mit Hilfe Parallel.Für() in .Net, die parallel extensions, da es eine einfache Möglichkeit der Parallelisierung von code, ohne manuell zu starten und zu pflegen threads (das kann fummelig). Ich bin jetzt auf der Suche in eine Endlosschleife (etwas tun, bis ich ein signal, es zu stoppen), dass ich wünschte, zu parallelisieren, gibt es nicht ein argument, freie Parallele.Für() überladen, um dies zu tun, so Frage mich, was der beste Ansatz wäre hier. Im Prinzip könnte ich mir so etwas wie:
Parallel.For(0, int.Max)
Aber ich bin zu Ahnen, dass vielleicht nicht die erwartete/effiziente Muster für die Arbeit, die Partitionierung der Logik zu behandeln(?)
Eine weitere option ist das etwas wie:
for(;;)
{
Parallel.For(0, 128, delegate()
{
//Do stuff.
}
}
Aber das scheint mir unelegant und kann auch dazu führen, die ineffizient arbeiten partitionieren.
Recht jetzt mein Instinkt ist, um dies manuell tun, indem Sie erstellen und pflegen meine eigenen threads, aber ich wäre daran interessiert, ein feedback/Meinungen zu diesem Thema. Danke.
=== UPDATE ===
Verwende ich eine vereinfachte version des Codes aus dem Artikel in der akzeptierten Antwort (ich habe entfernt die ParallelOptions parameter). Hier ist der code...
public class ParallelUtils
{
public static void While(Func<bool> condition, Action body)
{
Parallel.ForEach(IterateUntilFalse(condition), ignored => body());
}
private static IEnumerable<bool> IterateUntilFalse(Func<bool> condition)
{
while (condition()) yield return true;
}
}
Beispiel wäre:
Func<bool> whileCondFn = () => !_requestStopFlag;
ParallelUtils.While(whileCondFn, delegate()
{
//Do stuff.
});
- gibt es irgendwelche Threading-Modell, das Sie verbrauchen kann
Du musst angemeldet sein, um einen Kommentar abzugeben.
Stephen Toub hat einen Beitrag über Die Umsetzung Parallel, Während Sie mit Parallel.ForEach.
Wenn Sie (wirklich) wollen, etwas unendliches, dann willst du es auf so wenig Kerne eine möglich. Keiner der
Parallel.For___
wäre eine gute Wahl.Was Sie (vermutlich) brauchen, ist einen separaten Thread oder eine Aufgabe erstellt mit der LongRunning-option.
Und dann machen Sie warten auf ein semaphor, oder als letzten Ausweg call Sleep() so oft wie möglich.
Bedenkt, dass es infinit Rechnung anfordern, aber Sie müssen einige finit state auf jeden "Zyklus", würde ich sagen, dass ich ändern würde, eine Lösung mit einem externen
for(;;)
Schleife ausführenParallel.ForEach(...)
Anruf auf ein Ereignis/Zustand ändern. Wie einMonitor
signalevent
Benachrichtigung, oder so ähnlich...