[Python] gestire processi figli

Manlio Perillo manlio.perillo a gmail.com
Mer 27 Nov 2013 11:10:24 CET


On 27/11/2013 07:07, Balan Victor wrote:
> ciao a tutti,
> ho questa struttura:
> * 1 scheduler che scrive su una coda mq una serie di messaggi
> * 2 agenti che leggono i messaggi dalla coda
> * ogni messaggio sulla coda corrisponde a un "task" da lanciare
> * gli agenti lanciano il "task", attendono l'esecuzione e catturano
> l'output sullo stdout e l'exit code del task e lo inoltrano a un
> "raccoglitore"
>
> Ho 2 problemi:
> 1) i task hanno un timeout, finito quello devono essere "killati"
> 2) i task possono essere dei programmi che a loro volta lanciano dei
> altri programmi.
>
> il primo problema sono riuscito a risolverlo con l'aiuto degli Thread.
> Ho usato questo
> http://stackoverflow.com/questions/4158502/python-kill-or-terminate-subprocess-when-timeout
>

*Credi* di averlo risolto...

Esegui il processo separato in "background", usando subprocess, e se è 
ancora attivo dopo il timeout killalo.

Su Linux è banale, anche senza usare subprocess.  Su Windows è comunque 
possibile.  Con subprocess dovresti comunque cavartela.

La cosa più complessa e restare in attesa fin quando un processo termina.
Su sistemi POSIX puoi usare sigtimedwait, su FreeBSD kqueue con apposito 
filtro, su Linux epoll con quell'orrore di signalfd, su Windows 
WaitForMultipleObjects.

> mentre il secondo problema non so come risolverlo.

Perchè è un problema?

> Gli agenti sono su
> macchina windows e quello che dovrebbero fare è:
> 1)lanciare il "task"
> 2)attendere l'esecuzione del task e di eventuali sotto procressi
> lanciati dal task

Questo è un problema solo se chi esegue un sottoprocesso non aspetta che 
il figlio termina.  Su UNIX questa è una cosa cattiva e fa diventare il 
processo figlio uno zombie.

> 3)se è stato raggiunto il timeout "killare" tutto
>
> qualcuno ha qualche idea?
>

Ciao  Manlio



Maggiori informazioni sulla lista Python