multiprocessing pool.map funkcje wywołania w określonej kolejności

Jak mogę rozprowadzać procesy multiprocessing.pool.map w kolejności numerycznej?

Więcej informacji:
Mam program, który przetwarza kilka tysięcy plików danych, tworząc wykres każdego z nich. Używammultiprocessing.pool.map aby dystrybuować każdy plik do procesora i działa świetnie. Czasami zajmuje to dużo czasu i byłoby miło patrzeć na obrazy wyjściowe podczas działania programu. Byłoby to o wiele łatwiejsze, gdyby proces mapowania porządkował migawki; zamiast tego, dla właśnie uruchomionego właśnie uruchomienia, pierwszych 8 analizowanych migawek to:0, 78, 156, 234, 312, 390, 468, 546. Czy jest jakiś sposób, aby sprawić, by rozpowszechniał je bliżej w porządku liczbowym?

Przykład:
Oto przykładowy kod, który zawiera te same kluczowe elementy i pokazuje ten sam podstawowy wynik:

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) )

Plony:

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

Z @Hayden: użyj parametru „chunksize”,def map(self, func, iterable, chunksize=None).

Więcej informacji:
Thechunksize określa, ile iteracji jest przydzielanych do każdego procesora naraz. Mój przykład powyżej, na przykład, używa chunksize o wartości 2 --- co oznacza, że ​​każdy procesor wyłącza się i robi to za 2 iteracje funkcji, a następnie wraca po więcej („check-in”). Kompromis w stosunku do chunksize polega na tym, że „check-in” jest narzutem, gdy procesor musi zsynchronizować się z innymi --- sugerując, że chcesz miećduży chunksize. Z drugiej strony, jeśli masz duże porcje, wtedy jeden procesor może zakończyć swoją porcję, podczas gdy inny ma dużo czasu na przejście --- więc powinieneś użyćmały chunksize. Sądzę, że dodatkowe przydatne informacje to zakres, w jakim może trwać każde wywołanie funkcji. Jeśli naprawdę powinny one zajmować tyle samo czasu - bardziej efektywne jest użycie dużego rozmiaru porcji. Z drugiej strony, jeśli niektóre wywołania funkcji mogą trwać dwa razy dłużej niż inne, chcesz mały chunksize, aby procesory nie zostały przyłapane.

Jeśli chodzi o mój problem, każde wywołanie funkcji powinno trwać bardzo blisko tego samego czasu (tak myślę), więc jeśli chcę, aby procesy były wywoływane w kolejności, poświęcę wydajność z powodu narzutu narzutowego.

questionAnswers(2)

yourAnswerToTheQuestion