2016-03-10 20 views
11

Jaka jest różnica między używaniem mapy i map_async, Czy nie uruchamiają tej samej funkcji po dystrybucji elementów z listy do 4 procesów. Więc nie należy zakładać, że oba działają asynchronicznie i równolegle.Python multiprocessing: map vs map_async

def f(x): 
    return 2*x 

p=Pool(4) 
l=[1,2,3,4] 
out1=p.map(f,l) 
#vs 
out2=p.map_async(f,l) 
+1

Nie odwzorowuje 'map' tylko po wykonaniu mapy (tj. Synchronicznie, ale równolegle), podczas gdy' map_async' zwraca się od razu i pozwala na mapowanie wykonane w tle (tj. asynchronicznie i równolegle)? –

Odpowiedz

18

Dostępne są cztery opcje mapowania zadań do przetworzenia. Musisz wziąć pod uwagę multi-args, współbieżność, blokowanie i porządkowanie. map i map_asnyc różnią się tylko pod względem blokowania. map_async nie jest blokowanie gdzie jako map blokuje

Więc powiedzmy, że miał funkcję

from multiprocessing import Pool 
import time 

def f(x): 
    print x*x 

if __name__ == '__main__': 
    pool = Pool(processes=4) 
    pool.map(f, range(10)) 
    r = pool.map_async(f, range(10)) 
    # DO STUFF 
    print 'HERE' 
    print 'MORE' 
    r.wait() 
    print 'DONE' 

przykład wyjście:

0 
1 
9 
4 
16 
25 
36 
49 
64 
81 
0 
HERE 
1 
4 
MORE 
16 
25 
36 
9 
49 
64 
81 
DONE 

pool.map(f, range(10)) będzie czekać na wszystkich 10 z tych funkcji rozmowy, aby zakończyć więc widzimy wszystkie wydruki z rzędu r = pool.map_async(f, range(10)) wykonamy je asynchronicznie i tylko zablokujemy, gdy zostanie wywołana r.wait(), więc widzimy HERE i MORE pomiędzy, ale DONE zawsze będą na końcu

+1

ok, więc jeśli nie mam innych zadań do wykonania, poza wykonaniem funkcji f na liście, mapowanie i map_async są takie same. – aman

+3

Niezupełnie. Zauważysz, że mapa zostanie wykonana w kolejności, ale map_async nie ma wartości – quikst3r

+1

Czy po 'r.wait()' powinno być 'print 'DONE''? – HBeel

Powiązane problemy