[Py-MAD] POpen y process spawn

Pablo Conesa pconesa at cnb.csic.es
Thu Apr 29 09:14:41 CEST 2021


On 29/4/21 3:33, Jesus Cea wrote:
> On 28/4/21 20:31, Pablo Conesa wrote:
>
>> Hay un caso especial de "workers" que generan otros workers....de la 
>> misma manera que hace "GUI". Es decir:
>>
>> "worker2" genera "worker3", "worker4",...
>>
>> Sin embargo, "worker3", "worker4" ... mueren al matar "worker2".
>
> Voy a suponer que estar hablando de entornos Linux/Unix. (efectivamente)
>
> Que un proceso muera cuando muere su padre es algo que se programa en 
> el código del hijo (y tal vez del padre, si le manda una señal). 
> También depende de si hay "pipes" entre los procesos. Si un proceso 
> intenta leer de un "pipe", y el otro lado ha muerto, el proceso 
> receptor recibirá un
> error. La gestión de ese error depende del proceso que lo recibe.
Podría haber diferencias aqui, sys.stdout se desvia a un fichero en 
worker2, y puede que worker3 y worker4 lo "hereden"?
>
>> worker3 ha desaparecido porque es un "child" the worker2 y no 
>> queremos eso.
>
> En Unix, que un padre muera no implica que muera su hijo a menos que 
> se haya programado así. Si no haces nada especial, que se muera el 
> padre no implica nada. Forma parte del funcionamiento normal del sistema.
>
> Yo diría que tienes algún tipo de comunicación entre el padre y el 
> hijo, y al morir el padre ese canal de comunicación se rompe y el hijo 
> muere como consecuencia de ello.

Es correcto, no quería complicar la explicacion, pero si 
intencionadamente, al matar un proceso, queremos parar también sus 
"children":

def killWithChilds(pid):
     """ Kill the process with given pid and all children processes. Params: 
pid: the process id to terminate """ proc = psutil.Process(pid)
     for cin proc.children(recursive=True):
         if c.pidis not None:
             print("Terminating child pid: %d" % c.pid)
             c.kill()
     print("Terminating process pid: %s" % pid)
     if pidis None:
         print("WARNING! Got None PID!!!")
     else:
         proc.kill()



Estos children no serían "workers" serian comandos a programas que hace 
prosamiento de imagenes y en estos caso si queremos pararlos. Es solo en 
casos, excepcionales, donde lanzamos otros "workers", queremos "separar" 
el subproceso. Digamos que tenemos tener 2 modos de lanzar subprocesos: 
como child o separado.
>
> Mi consejo es que, si estás en Linux, usas "strace" en el "worker3" y 
> mates el "worker2" para ver qué recibe y cómo lo gestiona el 
> "worker3". Si estás en Solaris o derivados, la herramienta equivalente 
> es "truss".
Gracias, mirare strace, no sabia de su existencia.
>
> Una posibilidad que me parece remota, es que el padre esté usando 
> "sesiones", pero me sorprendería mucho. En unix haz "man 2 setsid" y 
> explora a partir de ahí. Pero ya te digo que me extrañaría mucho que 
> un proceso "random" utilizase estas funcionalidades "avanzadas".
>
> En cualquier caso diría que esto no tiene relación con tu código 
> Python en el GUI, pero sin saber qué procesos lanzas y cómo están 
> programados...
>

>
> _______________________________________________
> Asociación Python España: http://www.es.python.org/
> Python Madrid: http://www.python-madrid.es/
> Madrid mailing list
> Madrid at lists.es.python.org
> https://lists.es.python.org/listinfo/madrid
-- 
Pablo Conesa - *Madrid Scipion <http://scipion.i2pc.es> team*
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.es.python.org/pipermail/madrid/attachments/20210429/4aa1d83c/attachment-0001.htm>


More information about the Madrid mailing list