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.