<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html;
      charset=ISO-8859-15">
  </head>
  <body>
    <p><br>
    </p>
    <div class="moz-cite-prefix">On 29/4/21 3:33, Jesus Cea wrote:<br>
    </div>
    <blockquote type="cite"
      cite="mid:3ad43e8b-151b-9e98-a095-3fc0f4ae634d@jcea.es">On 28/4/21
      20:31, Pablo Conesa wrote:
      <br>
      <br>
      <blockquote type="cite">Hay un caso especial de "workers" que
        generan otros workers....de la misma manera que hace "GUI". Es
        decir:
        <br>
        <br>
        "worker2" genera "worker3", "worker4",...
        <br>
        <br>
        Sin embargo, "worker3", "worker4" ... mueren al matar "worker2".
        <br>
      </blockquote>
      <br>
      Voy a suponer que estar hablando de entornos Linux/Unix.
      (efectivamente)<br>
      <br>
      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 <br>
      error. La gestión de ese error depende del proceso que lo recibe.
      <br>
    </blockquote>
    Podría haber diferencias aqui, sys.stdout se desvia a un fichero en
    worker2, y puede que worker3 y worker4 lo "hereden"?<br>
    <blockquote type="cite"
      cite="mid:3ad43e8b-151b-9e98-a095-3fc0f4ae634d@jcea.es">
      <br>
      <blockquote type="cite">worker3 ha desaparecido porque es un
        "child" the worker2 y no queremos eso.
        <br>
      </blockquote>
      <br>
      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.
      <br>
      <br>
      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.</blockquote>
    <p>Es correcto, no quería complicar la explicacion, pero si
      intencionadamente, al matar un proceso, queremos parar también sus
      "children":</p>
    <pre style="background-color:#2b2b2b;color:#a9b7c6;font-family:'Fira Code Light',monospace;font-size:10.5pt;"><span style="color:#cc7832;">def </span><span style="color:#ffc66d;">killWithChilds</span>(pid):
    <span style="color:#629755;font-style:italic;">""" Kill the process with given pid and all children processes.
</span><span style="color:#629755;font-style:italic;">    Params:
</span><span style="color:#629755;font-style:italic;">     pid: the process id to terminate
</span><span style="color:#629755;font-style:italic;">    """
</span><span style="color:#629755;font-style:italic;">    </span>proc = psutil.Process(pid)
    <span style="color:#cc7832;">for </span>c <span style="color:#cc7832;">in </span>proc.children(<span style="color:#aa4926;">recursive</span>=<span style="color:#cc7832;">True</span>):
        <span style="color:#cc7832;">if </span>c.pid <span style="color:#cc7832;">is not None</span>:
            <span style="color:#8888c6;">print</span>(<span style="color:#6a8759;">"Terminating child pid: %d" </span>% c.pid)
            c.kill()
    <span style="color:#8888c6;">print</span>(<span style="color:#6a8759;">"Terminating process pid: %s" </span>% pid)
    <span style="color:#cc7832;">if </span>pid <span style="color:#cc7832;">is None</span>:
        <span style="color:#8888c6;">print</span>(<span style="color:#6a8759;">"WARNING! Got None PID!!!"</span>)
    <span style="color:#cc7832;">else</span>:
        proc.kill()



</pre>
    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.<br>
    <blockquote type="cite"
      cite="mid:3ad43e8b-151b-9e98-a095-3fc0f4ae634d@jcea.es">
      <br>
      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".
      <br>
    </blockquote>
    Gracias, mirare strace, no sabia de su existencia. <br>
    <blockquote type="cite"
      cite="mid:3ad43e8b-151b-9e98-a095-3fc0f4ae634d@jcea.es">
      <br>
      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".
      <br>
      <br>
      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...
      <br>
      <br>
    </blockquote>
    <br>
    <blockquote type="cite"
      cite="mid:3ad43e8b-151b-9e98-a095-3fc0f4ae634d@jcea.es"><br>
      <fieldset class="mimeAttachmentHeader"></fieldset>
      <pre class="moz-quote-pre" wrap="">_______________________________________________
Asociación Python España: <a class="moz-txt-link-freetext" href="http://www.es.python.org/">http://www.es.python.org/</a>
Python Madrid: <a class="moz-txt-link-freetext" href="http://www.python-madrid.es/">http://www.python-madrid.es/</a>
Madrid mailing list
<a class="moz-txt-link-abbreviated" href="mailto:Madrid@lists.es.python.org">Madrid@lists.es.python.org</a>
<a class="moz-txt-link-freetext" href="https://lists.es.python.org/listinfo/madrid">https://lists.es.python.org/listinfo/madrid</a>
</pre>
    </blockquote>
    <div class="moz-signature">-- <br>
      Pablo Conesa - <strong>Madrid <a href="http://scipion.i2pc.es">Scipion</a>
        team</strong></div>
  </body>
</html>