[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