2009-11-18 21 views
8

Me gustaría crear un proceso utilizando el módulo mutliprocessing en python pero asegúrate de que continúe ejecutándose después de que finalice el proceso que creó el subproceso.Separar un subproceso iniciado utilizando el módulo de multiprocesamiento de python

Puedo obtener la funcionalidad requerida usando el módulo de subproceso y Popen, pero quiero ejecutar mi código como una función, no como una secuencia de comandos. La razón por la que quiero hacer esto es simplificar la creación de objetos pyro (objetos remotos de python). Quiero iniciar el controlador de solicitud de objeto pyro en un proceso separado utilizando multiprocesamiento, pero luego quiero que el proceso principal salga mientras el proceso que soporta el objeto pyro continúa ejecutándose.

Respuesta

0

Lo que estás tratando de hacer es iniciar un proceso de daemon. Mire PEP-3143, y el paquete python-daemon.

echó un vistazo a Pyro, y parece que incluyen su propio módulo daemonzing,

Pyro/ext/daemonizer.py 
+0

Gracias por la respuesta. Habiendo encontrado esa solución recientemente, estoy de acuerdo. Sin embargo, python-daemon parece estar dirigido al paradigma más estándar donde un programa tiene una función que se inicia como daemon y nunca regresa. Me gustaría hacer algo en la línea de: con daemon.DaemonContext(): some_daemon_loop() continue_with_this_function_after_daemon_has_launched() Agradezco cualquier sugerencia. – glenn

+0

No había mirado realmente a pyro antes. A partir de una mirada superficial a su código, la clase "daemon" es algo así como un despachador de hilos, y no un proceso separado; en ningún lugar del código se bifurca. Pyro tiene un módulo incluido para la funcionalidad daemon daemon real. – JimB

4

finalmente conseguí lo que quería. Agradezco cualquier sugerencia para mejorar el código.

def start_server(): 
    pyrodaemon = Pyro.core.Daemon() 
    #setup daemon and nameserver 
    #Don't want to close the pyro socket 
    #Need to remove SIGTERM map so Processing doesn't kill the subprocess 
    #Need to explicitly detach for some reason I don't understand 
    with daemon.DaemonContext(files_preserve=[pyrodaemon.sock],signal_map={signal.SIGTERM:None},detach_process=True): 
     while running: 
      pyrodaemon.handleRequests(timeout=1.0) 
    #when finished, clean up 
    pyrodaemon.shutdown() 

def main(): 
    p = Process(target=start_server) 
    p.daemon=True # Need to inform Process that this should run as a daemon 
    p.start() 
    time.sleep(3.0) # Important when running this program stand alone: Must wait long enough for start_server to get into the daemon context before the main program exits or Process will take down the subprocess before it detaches 
    do_other_stuff_not_in_the_daemon() 
+1

La palabra daemon se está abusando aquí;) * No * configura Process.daemon en True. Eso le dice a multiprocesamiento que intente matar al niño al salir (confunde ¿eh?). Creo que es por eso que necesitas capturar SIGTERM y establecer detach_process en el código anterior. - http://docs.python.org/library/multiprocessing.html#multiprocessing.Process.daemon – JimB

Cuestiones relacionadas