2011-11-30 6 views
27

Implementé un paralelismo simple en un código de Monte Carlo utilizando el módulo de multiprocesamiento de Python. Tengo el código que se parece a:¿Puedo obtener un valor de retorno de multiprocesamiento.Proceso?

montecarlos = [MonteCarlo(f,fargs) for fargs in farglist] 
jobs = [multiprocessing.Process(mc) for mc in montecarlos] 
for job in jobs: job.start() 
for job in jobs: job.join() 
results = [mc.results for mc in montecarlos] 

Sin embargo, cuando miro a la lista de resultados, parece que los iteradores Monte Carlo ni siquiera han comenzado. Sé que tienen, porque puedo hacer que los procesos impriman información durante los pasos de monte carlo. Así que estoy haciendo algo tonto. Pensé que job.join() mantendría la lista de resultados sin construir hasta que todo se haya ejecutado, y así se actualizará el campo mc.results.

Me doy cuenta de que no te he contado los detalles de mi rutina monte carlo, y espero que no importe, y que el error que estoy cometiendo es en mi interpretación de lo que hace el multiprocesamiento. Gracias de antemano por cualquier ayuda que pueda ofrecer.

Respuesta

35

Los objetos MonteCarlo se han escamado y se han enviado a procesos secundarios para su ejecución: el atributo .results en este proceso no se rellena porque el mc local nunca se ha ejecutado.

Si crea un multiprocessing.Queue, puede pasarlo a cada trabajo MonteCarlo, y cuando termine debe poner el resultado allí. Luego, el nivel superior puede esperar valores de la cola. (Debajo del capó esto saltará y deshará el objeto resultante.)

result_queue = multiprocessing.Queue() 
montecarlos = [MonteCarlo(result_queue, f,fargs) for fargs in farglist] 
jobs = [multiprocessing.Process(mc) for mc in montecarlos] 
for job in jobs: job.start() 
for job in jobs: job.join() 
results = [result_queue.get() for mc in montecarlos] 
+0

Esto funcionó muy bien! ¡Muchas gracias! Gracias también por una explicación tan clara de lo que estaba pasando. – Rick

Cuestiones relacionadas