C # parallel foreach gleichermaßen Aufgaben zu beenden

8

Ich verwende C # Parallel.ForEach, um mehr als tausend Teilmengen von Daten zu verarbeiten. Ein Set dauert je nach Größe des Sets 5-30 Minuten. In meinem Computer mit Option

%Vor%

Ich werde 8 parallele Prozesse bekommen. Wie ich verstanden habe, werden die Prozesse gleichmäßig auf parallele Aufgaben verteilt (z. B. erhält die erste Aufgabe die Jobs Nummer 1,9,17 usw., die zweite erhält 2,10,18 usw.); Daher kann eine Aufgabe eigene Jobs früher erledigen als andere. Weil diese Datensätze weniger Zeit benötigen als andere.

Das Problem besteht darin, dass vier parallele Aufgaben ihre Arbeit innerhalb von 24 Stunden beenden, die letzte jedoch innerhalb von 48 Stunden. Gibt es da eine Chance, Parallelität zu organisieren, damit alle parallelen Aufgaben gleich beendet werden? Es bedeutet, dass alle parallelen Aufgaben weiter funktionieren, bis alle Jobs erledigt sind?

    
Allan 06.03.2013, 15:56
quelle

3 Antworten

4

Da die Jobs nicht gleich sind, können Sie die Anzahl der Jobs nicht zwischen Prozessoren aufteilen und sie ungefähr zur gleichen Zeit beenden. Ich denke, was Sie hier brauchen, ist 8 Worker-Threads, die den nächsten Job in der Zeile abrufen. Sie müssen eine Sperre für die Funktion verwenden, um den nächsten Job zu erhalten.

Jemand korrigiert mich, wenn ich falsch liege, aber von der Spitze meines Kopfes ... könnte ein Arbeitsthread eine Funktion wie folgt erhalten:

%Vor%

Und die Funktion, um den nächsten Job zu bekommen, würde aussehen:

%Vor%     
Matt Miller 06.03.2013, 16:08
quelle
1

Es scheint, dass es keine gebrauchsfertige Lösung gibt und diese erstellt werden muss.

Mein vorheriger Code war:

%Vor%

Um die Arbeit gleichmäßig zwischen allen CPUs zu teilen, benutze ich immer Parallel , um die Arbeit zu erledigen, aber statt ForEach verwende ich For und eine Idee von Matt. Der neue Code lautet:

%Vor%

Also, vielen Dank für Ihren Rat.

    
Allan 07.03.2013 17:24
quelle
1

Eine Möglichkeit, wie von anderen vorgeschlagen, besteht darin, Ihre eigene Producer-Warteschlange zu verwalten. Ich möchte anmerken, dass die Verwendung von BlockingCollection das sehr leicht macht.

%Vor%     
Servy 07.03.2013 17:34
quelle

Tags und Links