python 2.7 - set_start_method - multiprocesamiento: map vs map_async
python pool map multiple arguments (1)
Hay cuatro opciones para asignar trabajos a procesos. Debe tener en cuenta los argumentos múltiples, la concurrencia, el bloqueo y el orden. map
y map_asnyc
solo difieren con respecto al bloqueo. map_async
no es bloqueante mientras que el map
está bloqueando
Así que digamos que tenías una función
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''
Ejemplo de salida:
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))
esperará a que terminen las 10 llamadas de función, por lo que vemos todas las impresiones en una fila. r = pool.map_async(f, range(10))
los ejecutará de forma asíncrona y solo se bloqueará cuando se r.wait()
así que vemos HERE
y MORE
pero DONE
siempre estará al final.
¿Cuál es la diferencia entre usar map
y map_async
? ¿No están ejecutando la misma función después de distribuir los elementos de la lista a 4 procesos?
Entonces, ¿es incorrecto suponer que ambos se ejecutan de forma asíncrona y paralela?
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)