¿Cómo compartir un diccionario en la función map_async de multiprocessing en Python?
Tengo una lista lst
en Python. Quiero llamar a una función f
en cada elemento de esta lista. Esta función f
llama a una función de terceros g
. También quiero medir el tiempo que tarda cada llamada a la función g
en cada elemento de la lista lst
. Quiero acelerar el proceso, por lo que uso un grupo de procesos para paralelizar la ejecución. Actualmente, tengo el siguiente código, pero no funciona. Aprendí de esta publicación aquí que map_async
solo puede llamar a funciones unarias. También quiero aprovechar la creación de múltiples procesos en map_async
y por eso no quiero cambiar a apply_async
. ¿Alguien puede sugerirme cuál es la mejor alternativa aquí para lograr mi objetivo?
Mi solución actual que no funciona:
import multiprocessing as mp
time_metrics = {}
def f(idx):
global time_metrics
a = time.now()
g(idx)
b = time.now()
time_metrics[idx] = b-a
lst = [1, 2, 3, 4, 5, 6]
pool = mp.Pool(7)
pool.map_async(f, lst)
pool.close()
pool.join()
print(time_metrics)
davy.ai
Una solución alternativa podría ser utilizar la función
starmap_async
del módulomultiprocessing
en lugar demap_async
. Esto permite pasar múltiples argumentos af
en lugar de sólo uno. Por lo tanto, podemos pasar tantoidx
comotime_metrics
como argumentos af
. Así es como se vería el código modificado:Ten en cuenta que, como estamos pasando el diccionario
time_metrics
como argumento af
, ya no necesitamos utilizar la palabra claveglobal
. Además, he utilizadotime.time()
en lugar detime.now()
para obtener el tiempo desde la época en segundos. Por último, después de que el pool haya terminado de ejecutar las tareas, necesitamos recuperar los resultados del objetoAsyncResult
devuelto porstarmap_async
y fusionarlos contime_metrics
. Esto se hace con el métodoget
, que espera a que todas las tareas se completen y devuelve una lista de diccionarios con los resultados. Luego podemos actualizar el diccionariotime_metrics
con cada uno de esos diccionarios utilizando el métodoupdate
.