2009-11-18 24 views
8

Je souhaite créer un processus en utilisant le module mutliprocessing en python, mais je m'assure qu'il continue à s'exécuter après la fermeture du processus qui a créé le sous-processus.Détacher un sous-processus lancé à l'aide du module de multi-traitement python

Je peux obtenir la fonctionnalité requise en utilisant le module de sous-processus et Popen, mais je veux exécuter mon code en tant que fonction, pas en tant que script. La raison pour laquelle je veux faire ceci est de simplifier la création d'objets pyro (objets distants python). Je veux démarrer le gestionnaire de requêtes d'objet pyro dans un processus séparé en utilisant le multitraitement, mais je veux que le processus principal se termine pendant que le processus supportant l'objet pyro continue à s'exécuter.

Répondre

0

Ce que vous essayez de faire est de démarrer un processus démon. Regardez PEP-3143 et le package python-daemon.

A pris un regard sur Pyro, et il semble qu'ils comprennent leur propre module daemonzing,

Pyro/ext/daemonizer.py 
+0

Merci pour la réponse. Ayant moi-même rencontré cette solution récemment, je suis d'accord. Cependant, python-daemon semble cibler le paradigme plus standard où un programme a une fonction qui est démarrée en tant que démon et qui ne retourne jamais. Je voudrais faire quelque chose le long des lignes de: avec daemon.DaemonContext(): some_daemon_loop() continue_with_this_function_after_daemon_has_launched() Je vous remercie des suggestions. – glenn

+0

Je n'avais pas vraiment regardé pyro avant. D'un coup d'œil rapide sur leur code, la classe "démon" est quelque chose comme un répartiteur à threads, et non un processus séparé; pas d'endroit où le code fourche. Pyro a un module inclus pour la fonctionnalité démon démon réel. – JimB

4

J'ai finalement obtenu ce que je voulais. J'apprécie toutes les suggestions pour améliorer le code.

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

Le mot daemon est abusé ici;) * Ne pas * mettre Process.daemon à True. Cela dit au multitraitement de tenter de tuer l'enfant à la sortie (confusion hein?). Je pense que c'est pourquoi vous devez attraper SIGTERM et définir detach_process dans le code ci-dessus. - http://docs.python.org/library/multiprocessing.html#multiprocessing.Process.daemon – JimB