2016-03-10 3 views
11

В чем разница между использованием map и map_async, не работают ли они с той же функцией после распределения элементов из списка до 4 процессов. Неправильно ли предположить, что оба они работают асинхронно и параллельно.Pulton 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

Не отображает 'map' только после того, как карта выполнена (то есть синхронно, но параллельно), в то время как' map_async' возвращает сразу и позволяет отображать выполняется в фоновом режиме (т.е. асинхронно и параллельно)? –

ответ

18

Существует четыре варианта сопоставления заданий для обработки. Вы должны учитывать multi-args, параллелизм, блокировку и упорядочение. map и map_asnyc отличаются только блокировкой. map_async неблокирующая где, как map блокирует

Так позволяет сказать, что у вас есть функция

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' 

пример вывода:

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)) будет ждать все 10 из этих вызовов функций, чтобы закончить поэтому мы видим, что все отпечатки в строке r = pool.map_async(f, range(10)) будут выполнять их асинхронно и только блокировать, когда вызывается r.wait(), поэтому мы видим HERE и MORE между ними, но DONE всегда будет в конце

+1

ok, так что если у меня нет других задач для выполнения функции f над списком, тогда map и map_async такие же – aman

+3

Не совсем. Вы заметите, что карта будет выполнена по порядку, но map_async не – quikst3r

+1

Должно ли быть 'print 'DONE'' после' r.wait() '? – HBeel