Estoy tratando de invocar una función en múltiples procesos. La solución obvia es el módulo multiprocessing
de python. El problema es que la función tiene efectos secundarios. Crea un archivo temporal y registra ese archivo para eliminar al salir usando atexit.register
y una lista global. Lo siguiente debería demostrar el problema (en un contexto diferente).python parallel map (multiprocesamiento.Pool.map) con datos globales
import multiprocessing as multi
glob_data=[]
def func(a):
glob_data.append(a)
map(func,range(10))
print glob_data #[0,1,2,3,4 ... , 9] Good.
p=multi.Pool(processes=8)
p.map(func,range(80))
print glob_data #[0,1,2,3,4, ... , 9] Bad, glob_data wasn't updated.
¿Hay alguna manera de tener los datos globales actualizados?
Tenga en cuenta que si prueba el script anterior, probablemente no debería intentarlo con el intérprete interactivo ya que multiprocessing
requiere que el módulo __main__
sea importable por procesos secundarios.
ACTUALIZACIÓN
añadido la palabra clave global
en func no ayuda - por ejemplo:
def func(a): #Still doesn't work.
global glob_data
glob_data.append(a)
Saludos, esto funciona a la perfección para mi. Debo mencionar aquí que funciona porque los objetos que estoy agregando a glob_data son inmutables (como en el ejemplo, cadenas en mi aplicación real). Si los objetos que se empacan en la lista son mutables, se debe tener cuidado de volver a agregarlos a la lista si se modifican. – mgilson
a su servicio :) –
@RafaelFerreira ¡Funciona bien! pero los resultados no son consistentes, como en mi caso ... estoy usando manager.dict(), los valores cambian cada vez que ejecuto mi código. Veo que se debe aplicar el bloqueo pero no estoy seguro. –