[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Manejo de procesos



> Esta es la idea, cómo puedo verificar el progreso de un determinado
> proceso: su comienzo, desarrollo y terminación?
Saludos!

El comienzo y la terminación de los procesos es sencillo. El comienzo
lo conoces porque, supongo, tú inicias ese proceso, por ejemplo:

  subprocess.call(['sleep', '10'])

[...] y suponemos que esto lo realizas después de un os.fork(), en
tal caso, al momento de hacer el fork() tú puedes comenzar a contar
el tiempo. Y cuando termine el proceso que llamaste, por ejemplo al
sleep, te regresa el control al otro proceso de python, y este ya
puede notificar a su padre de que terminó el otro proceso.
Gráficamente se ve algo así:


  [Python padre]
     |
     | <- después de llamar os.fork()
      \
      [Python hijo]
           |
           | <- después de llamar subprocess.call()
           \
          [Proceso 'sleep 10']

Mientras se ejecuta 'sleep 10', el proceso de python hijo estará
"bloqueado". El padre no se bloquea, a menos de que hagas la llamada
wait(). No estoy seguro de si se manda por defecto el SIGCHLD o tú
debes registrarlo, pero la forma en que el sistema operativo comunica
al padre que su hijo ha muerto es a través de un SIGCHLD.

Entonces, el flujo se vería un tanto así:

[Python hijo lanza 'sleep 10'] 
  => [Pasan 10 segundos (el hijo se "bloquea", osea, no avanza)]
  => [El hijo se desbloquea al terminar el 'sleep 10']
  => [El hijo muere, ya que no hay más código por ejecutar]
  => [El padre recibe la señal SIGCHLD por parte del SO de que su
    hijo ha finalizado]

Los detalles específicos no los tengo frescos, pero aquí hay algunas
ligas (en inglés), que hablan al respecto:

- http://stackoverflow.com/questions/3675675/how-do-i-know-when-a-child-process-died
- http://stackoverflow.com/questions/11009567/exiting-the-child-process-after-os-fork

En cuanto a conocer el progreso... eso está complicado! ¿por qué?
porque tú no tienes manera de saber si un proceso se quedó colgado, o
si está haciendo una operación, si se cayó la red y está esperando a
que regresé, ...

Es decir, el "progreso" es totalmente dependiente del programa en
específico. No existe un concepto unificado de progreso entre las
utilerías. Aquí ya debes decidir tú qué mostrar, y posiblemente
involucrará un mayor entendimiento de los comandos que lanzarás a
través de tu GUI. Tal vez alguna especie de comunicación
interprocesos donde el comando lanzado notifique del progreso, pero
cada uno lo implementa a su manera.

-- 
Eduardo Alan Bustamante López


Reply to: