Multiprocesamiento de Python: matar al trabajador en la salida

He escrito una función simple para ejecutar trabajos con seguimiento de dependencias. El código exacto no es importante, pero la forma en que lo hice es crear una función de supervisión de trabajos que puedo realizar mediante multiprocessing.Process , envío y recibo trabajos de / con dos objetos de Queue multiprocesamiento.

Funciona muy bien, pero debido a que uso un bucle infinito, cuando el proceso principal se bloquea en la salida, porque Python todavía está esperando al niño. ¿Hay una buena manera de matar un proceso hijo inmediatamente después de salir? Tal vez por la captura de una señal?

Mi código actual está aquí: https://gist.github.com/MikeDacre/e672969aff980ee950b9dfa8b2552d40 Un ejemplo más completo está aquí: http://nbviewer.jupyter.org/github/MikeDacre/python-cluster/blob/cluster/test/ local_queue.ipynb

Un ejemplo de juguete es probablemente mejor sin embargo:

 import multiprocessing as mp from time import sleep def runner(): while True: sleep(2) runner = mp.Process(target=runner) runner.start() exit() 

Eso colgará felizmente hasta que se ingresa Ctrl-C.

No creo que la captura de señales funcione, ya que no hay señales enviadas en la salida normal. ¿Hay alguna forma de atrapar la exit() ? Si no es así, ¿hay alguna manera de crear un Proceso de una manera que termine naturalmente?

Gracias a todos, poco después de escribir esta pregunta, descubrí la solución utilizando el módulo atexit de python:

 import atexit import multiprocessing as mp from time import sleep def runner(): while True: sleep(2) def kill_runner(runner): runner.terminate() runner = mp.Process(target=runner) runner.start() atexit.register(kill_runner, runner) exit() 

Eso funciona como se esperaba.