El multiprocesamiento de Python nunca se une

Estoy usando el multiprocessing , y específicamente un Pool para escindir un par de ‘hilos’ para hacer un montón de trabajos lentos que tengo. Sin embargo, por alguna razón, no puedo volver a unir el hilo principal, a pesar de que todos los niños parecen haber muerto.

Resuelto: parece que la respuesta a esta pregunta es simplemente lanzar varios objetos de Process , en lugar de usar un Pool . No está muy claro por qué, pero sospecho que el proceso restante es un administrador de la agrupación y no se está muriendo cuando finalizan los procesos. Si alguien más tiene este problema, esta es la respuesta.


Hilo principal

 pool = Pool(processes=12,initializer=thread_init) for x in xrange(0,13): pool.apply_async(thread_dowork) pool.close() sys.stderr.write("Waiting for jobs to terminate\n") pool.join() 

El xrange(0,13) es uno más que el número de procesos porque pensé que tenía un error por uno, y un proceso no estaba obteniendo un trabajo, así que no estaba muriendo y quería forzarlo a aceptar un trabajo . Lo he probado con 12 también.

Funciones de multiprocesamiento

 def thread_init(): global log_out log_out = open('pool_%s.log'%os.getpid(),'w') sys.stderr = log_out sys.stdout = log_out log_out.write("Spawned") log_out.flush() log_out.write(" Complete\n") log_out.flush() def thread_dowork(): log_out.write("Entered function\n") log_out.flush() #Do Work log_out.write("Exiting ") log_out.flush() log_out.close() sys.exit(0) 

La salida de los archivos de registro para los 12 hijos es:

 Spawned Complete Entered function Exiting 

El hilo principal imprime ‘Esperando a que terminen los trabajos’, y luego se queda allí.

top muestra solo una copia del script (creo que la principal). htop muestra dos copias, una de las cuales es la de arriba y la otra es otra. Basado en su PID, tampoco es ninguno de los niños.

¿Alguien sabe algo que yo no?

Realmente no tengo una respuesta, pero leí los documentos de Apply_async y parece contrario a su problema declarado …

Las devoluciones de llamada deben completarse inmediatamente, ya que de lo contrario se bloqueará el hilo que maneja los resultados.

No estoy familiarizado con el Pool, pero me parece que su caso de uso podría manejarse fácilmente con esta receta en el Módulo de la Semana de Python