Aufruffunktionen von multiprocessing pool.map in bestimmter Reihenfolge

Wie kann ich multiprocessing.pool.map dazu bringen, Prozesse in numerischer Reihenfolge zu verteilen?

Mehr Info:
Ich habe ein Programm, das ein paar tausend Dateien verarbeitet und von jeder einen Plot erstellt. Ich benutze einemultiprocessing.pool.map jede Datei an einen Prozessor zu verteilen und es funktioniert großartig. Manchmal dauert dies sehr lange, und es wäre schön, die ausgegebenen Bilder während der Ausführung des Programms anzusehen. Dies wäre viel einfacher, wenn der Kartenprozess die Schnappschüsse der Reihe nach verteilen würde. Stattdessen lauteten die ersten 8 analysierten Schnappschüsse für den gerade ausgeführten Lauf:0, 78, 156, 234, 312, 390, 468, 546. Gibt es eine Möglichkeit, sie in numerischer Reihenfolge näher zu verteilen?

Beispiel:
Hier ist ein Beispielcode, der dieselben Schlüsselelemente enthält und dasselbe grundlegende Ergebnis zeigt:

import sys
from multiprocessing import Pool
import time

num_proc  = 4; num_calls = 20; sleeper   = 0.1

def SomeFunc(arg):
    time.sleep(sleeper)
    print "%5d" % (arg),
    sys.stdout.flush()     # otherwise doesn't print properly on single line

proc_pool = Pool(num_proc)
proc_pool.map( SomeFunc, range(num_calls) )

Erträge:

   0  4  2  6   1   5   3   7   8  10  12  14  13  11   9  15  16  18  17  19
Antworten:

Von @ Hayden: Verwenden Sie den Parameter 'chunksize',def map(self, func, iterable, chunksize=None).

Mehr Info:
Daschunksize legt fest, wie viele Iterationen jedem Prozessor gleichzeitig zugewiesen werden. In meinem obigen Beispiel wird zum Beispiel eine Blockgröße von 2 --- verwendet, was bedeutet, dass jeder Prozessor ausfällt und für zwei Iterationen der Funktion sein Ding tut und dann für weitere zurückkommt ("Check-in"). Der Nachteil von Chunksize besteht darin, dass der Check-in-Aufwand zunimmt, wenn der Prozessor mit den anderen synchronisiert werden muss - was darauf hindeutet, dass Sie eine möchtengroße stückgröße. Auf der anderen Seite, wenn Sie große Chunks haben, könnte ein Prozessor seinen Chunk beenden, während ein anderer noch viel Zeit hat --- also sollten Sie a verwendenkleine stückgröße. Ich denke, die zusätzlichen nützlichen Informationen sind, wie viel Reichweite es gibt, wie lange jeder Funktionsaufruf dauern kann. Wenn sie wirklich alle gleich viel Zeit in Anspruch nehmen sollten, ist es effizienter, einen großen Block zu verwenden. Wenn andererseits einige Funktionsaufrufe doppelt so lange dauern könnten wie andere, möchten Sie eine kleine Blockgröße, damit die Prozessoren nicht beim Warten erwischt werden.

Für mein Problem sollte jeder Funktionsaufruf ungefähr so ​​lange dauern (glaube ich). Wenn ich also möchte, dass die Prozesse in der richtigen Reihenfolge aufgerufen werden, werde ich aufgrund des Check-in-Overheads Effizienz einbüßen.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage