2009-11-18 12 views
8

Vorrei creare un processo utilizzando il modulo di elaborazione multipla in python ma assicurarsi che continui a essere in esecuzione dopo il processo che ha creato le sottoprocessi uscite.Scollegamento di un sottoprocesso avviato utilizzando il modulo di multiprocessing python

È possibile ottenere la funzionalità richiesta utilizzando il modulo di sottoprocesso e Popen, ma voglio eseguire il mio codice come una funzione, non come uno script. La ragione per cui voglio farlo è semplificare la creazione di oggetti pyro (oggetti remoti python). Voglio avviare il gestore di richieste di oggetti pyro in un processo separato usando la multiprocessing, ma poi voglio che il processo principale esca mentre il processo che supporta l'oggetto pyro continua a funzionare.

risposta

0

Quello che stai cercando di fare è avviare un processo demone. Vedere PEP-3143 e il pacchetto python-daemon.

preso uno sguardo in Pyro, e sembra che includono il proprio modulo daemonzing,

Pyro/ext/daemonizer.py 
+0

Grazie per la risposta. Avendo incontrato di recente questa soluzione, sono d'accordo. Tuttavia, python-daemon sembra essere indirizzato al paradigma più standard in cui un programma ha una funzione avviata come demone e che non restituisce mai. Mi piacerebbe fare qualcosa sulla falsariga di: con daemon.DaemonContext(): some_daemon_loop() continue_with_this_function_after_daemon_has_launched() Apprezzo tutti i suggerimenti. – glenn

+0

Prima non avevo davvero guardato pyro. Da una rapida occhiata al loro codice, la classe "daemon" è qualcosa come un dispatcher thread e non un processo separato; no dove nel codice fa mai forchetta. Pyro ha un modulo incluso per la funzione demone real daemon. – JimB

4

finalmente ho ottenuto quello che volevo. Apprezzo qualsiasi suggerimento per migliorare il codice.

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

Qui la parola daemon viene violata qui;) * Non * imposta Process.daemon su True. Che dice multiprocessing per tentare di uccidere il bambino all'uscita (confondere huh?). Penso che sia per questo che hai bisogno di catturare SIGTERM e impostare detach_process nel codice sopra. - http://docs.python.org/library/multiprocessing.html#multiprocessing.Process.daemon – JimB

Problemi correlati