multiprocessing.Pool generando un nuevo childern después de terminate () en Linux / Python2.7?
Tengo un archivo ejecutable que necesito ejecutar muy a menudo, con diferentes parámetros. Para esto escribí una pequeña envoltura de Python (2.7), usando el módulo de multiprocesamiento, siguiendo el patrón dadoaquí.
Mi código se ve así:
try:
logging.info("starting pool runs")
pool.map(run_nlin, params)
pool.close()
except KeyboardInterrupt:
logging.info("^C pressed")
pool.terminate()
except Exception, e:
logging.info("exception caught: ", e)
pool.terminate()
finally:
time.sleep(5)
pool.join()
logging.info("done")
Mi función de trabajador está aquí:
class KeyboardInterruptError(Exception): pass
def run_nlin((path_config, path_log, path_nlin, update_method)):
try:
with open(path_log, "w") as log_:
cmdline = [path_nlin, path_config]
if update_method:
cmdline += [update_method, ]
sp.call(cmdline, stdout=log_, stderr=log_)
except KeyboardInterrupt:
time.sleep(5)
raise KeyboardInterruptError()
except:
raise
path_config
es la ruta a un archivo de configuración para el programa binario; allí hay por ejemplo La fecha para ejecutar el programa para.
Cuando empiezo la envoltura, todo se ve bien. Sin embargo, cuando presiono^C
, el script wrapper parece lanzar un adicionalnumproc
Procesos de la piscina antes de terminar. Como ejemplo, cuando comienzo el script para los días 1-10, puedo ver en elps aux
salida que se ejecutan dos instancias del programa binario (generalmente para los días 1 y 3). Ahora, cuando presiono^C
, el script contenedor se cierra, los programas binarios para los días 1 y 3 se han ido, pero hay nuevos programas binarios que se ejecutan para los días 5 y 7.
Así que a mi me parece como si elPool
lanza otronumproc
Procesos antes de finalmente morir.
¿Alguna idea de lo que está pasando aquí, y qué puedo hacer al respecto?