Multiprocesamiento de Python: ¿Cómo liberar memoria cuando se realiza un proceso?

Encontré un problema extraño al usar la biblioteca de multiprocesamiento de Python.

Mi código se resume a continuación: Generé un proceso para cada tupla “símbolo, fecha”. Combino los resultados después.

¿Espero que cuando un proceso haya terminado de calcular una tupla de “símbolo, fecha”, deba liberar su memoria? Al parecer ese no es el caso. Veo docenas de procesos (aunque configuro el grupo de procesos para que tenga tamaño 7) que están suspendidos en la máquina. No consumen CPU, y no liberan la memoria.

¿Cómo permito que un proceso libere su memoria, una vez que haya realizado su cálculo?

¡Gracias!

¹ por “suspendido” me refiero a que su estado en el comando ps se muestra como “S +”

def do_one_symbol( symbol, all_date_strings ): pool = Pool(processes=7) results = []; for date in all_date_strings: res = pool.apply_async(work, [symbol, date]) results.append(res); gg = mm = ss = 0; for res in results: g, m, s = res.get() gg += g; mm += m; ss += s; 

¿ pool.close cerrar el grupo mediante el uso de pool.close y luego esperar a que el proceso termine en pool.join , ya que si el proceso principal sigue ejecutándose y no espera los procesos secundarios, se convertirán en zombies?

Intente establecer el argumento maxtasksperchild en el grupo. Si no lo hace, entonces el proceso se reutiliza una y otra vez en la piscina para que la memoria nunca se libere. Una vez establecido, el proceso podrá morir y se creará uno nuevo en su lugar. Eso limpiará efectivamente la memoria.

Supongo que es nuevo en 2.7: http://docs.python.org/2/library/multiprocessing.html#module-multiprocessing.pool

Probablemente debería llamar a close() seguido de wait() en su objeto Pool .

http://docs.python.org/library/multiprocessing.html#module-multiprocessing.pool

join() Espera a que salgan los procesos de trabajo. Uno debe llamar a close () o terminate () antes de usar join ().