Ответ 1
Существует четыре варианта отображения заданий на процессы. Вы должны учитывать несколько аргументов, параллелизм, блокировку и упорядочение. map
и map_async
отличаются только в отношении блокировки. 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
всегда будет в конце.