2014-08-28 4 views
11

sto deposizione delle uova 5 diversi processi da uno script python, in questo modo:uccidere il figlio di processo Se il padre viene ucciso in Python

p = multiprocessing.Process(target=some_method,args=(arg,)) 
p.start() 

Il mio problema è, quando, in qualche modo il processo padre (lo script principale) ottiene ucciso, i processi figli continuano a funzionare.

C'è un modo per uccidere i processi figli, che vengono generati in questo modo, quando il genitore viene ucciso?

EDIT: sto cercando questo:

p = multiprocessing.Process(target=client.start,args=(self.query_interval,)) 
p.start() 
atexit.register(p.terminate) 

Ma questo doesnt sembrano funzionare

+3

Duplicato? http://stackoverflow.com/questions/14128410/killing-child-process-when-parent-crashes-in-python – theAlse

+0

Avevo passato questo post, in particolare parla di "popen" e sottoprocesso –

+0

Come funziona il processo padre essere ucciso? – Korem

risposta

3

Il bambino non viene notificato della morte del suo genitore, funziona solo il contrario.

Tuttavia, quando un processo muore tutti i suoi descrittori di file sono chiusi. E l'altra estremità di un tubo viene avvertita di questo, se lo seleziona per la lettura.

Così il genitore può creare una pipe prima di generare il processo (o, in effetti, puoi semplicemente impostare stdin come pipe), e il bambino può selezionarlo per la lettura. Riporterà pronto per la lettura quando viene chiusa la fine genitore. Ciò richiede che tuo figlio esegua un ciclo di posta o almeno effettui chiamate regolari per la selezione. Se non lo vuoi, avrai bisogno di qualche processo manageriale per farlo, ma poi quando quello sarà ucciso, le cose si romperanno di nuovo.

12

Ho incontrato lo stesso problema io stesso, ho la seguente soluzione:

prima di chiamare p.start(), è possibile impostare p.daemon=True. Quindi come indicato qui python.org multiprocessing

Quando un processo termina, tenta di terminare tutti i suoi processi figli demoniaci.