duda de threads

Joaquin Jose del Cerro Murciano jjdelcerromurciano en yahoo.es
Sab Jun 4 11:02:18 CEST 2005


Nos vendria bien saber si son thread/hebras/hilos o procesos.
Si son procesos, que por lo que dice de saber el pid tiene pinta, te dejo aqui 
un programita chorra que puede darte ideas.

-------------- inicio codigo -----------------------

import os
import time
import signal
import sys

childpid = -1

def seHaMuertoUnHijo(sig,frame):
  global childpid
  
  pid, status = os.wait()
  print "PARENT: PID=%d, se ha muerto el hijo %s" % (
    os.getpid(),
    pid
  )
  if childpid == pid:
    childpid = -1
   
  
def main():
  global childpid
  
  signal.signal(signal.SIGCHLD,seHaMuertoUnHijo)
  ppid=os.getpid()
  print "PARENT: PID=%d" % os.getpid()
  childpid = os.fork()
  if childpid == 0:
    while True:
      print "CHILD : PID=%d, PPID=%d" % (
        os.getpid(),
        os.getppid()
      )
      time.sleep(1)
    sys.exit(0)
  for n in range(5):
    print "PARENT: PID=%d" % os.getpid()
    time.sleep(2)
  if childpid > 0:
    os.kill(childpid,signal.SIGTERM)
    print "PARENT: he hecho el kill."
  print "PARENT: Haz un ps y comprueba que se ha muerto el hijo."
  time.sleep(20)
  print "PARENT: Ahora me muero yo."

main()

-------------- fin codigo -----------------------
(El codigo de arriba va en un python 2.4+FreeBSD 5.4)


El programa no hace nada, pero puede servir de primera guia sobre como se 
pueden lanzar y matar procesos. Hay que tener algunas cosas importantes en 
mente:

- fork() solo va en sistemas "Unix like" no en güindous.
- fork(), en el padre retorna el pid del hijo y en el hijo cero.
- Hay un pollo con las señales (me suena que ya se trato en la lista hace un 
tiempo).

Las señales.
Cuando un proceso hijo se muere envia una señal SIGCHLD al padre. Si en padre 
no trata esta señal, el proceso hijo se queda "zombie". Lo que hacemos es 
atrapar la señal SIGCHLD y hacer un wait, con lo que conseguimos asegurarnos 
de que el proceso hijo se muere sanamente y no se quede zombie.

No estaria mal leer:
- Ayuda del modulo "os" respecto a fork y wait.
- Ayuda del modulo signal.
- man 2 fork
- man 2 wait 

No estaria mal montar algo mas estructurado como una clase que se encargase de 
lanzar y controlar que hijos estan vivos y cuales no. Podria ser algo como :

-------------- inicio codigo -----------------------

class ChildHandler(object):
  
  def __init__(self):
    self._childs = list()
    signal.signal(signal.SIGCHLD,self.__notifyHandler)
    
  def __notifyHandler(self,sig,frame):
    # Esperamos que el hijo se muera sanamente y recogemos su pid y status.
    pid, status = os.wait()
    if pid in self._childs:
      # Si estaba en la lista de hijos lo quitamos, por que ya se ha muerto.
      self._child.remove(pid)
    
  def start(self, function, *args, **kw):
    # Recive la funcion y argumentes que tiene que ejecutar en el proceso
    # los ejecuta y guarda el pid del hijo.
    childpid = os.fork()
    if childpid == 0:
      # En el proceso hijo ejecutamos la funcion pasada.
      n=function(*args, **kw)
      # Ahora nos preocupamos que el hijo retorne como status el valore 
      # re retorno de la funcion.
      try:
        n=int(n)
      except:
        n=0
      sys.exit(n)
    # una vez lanzado el proceso hijo metemos su pid en la lista.
    self._childs.append(childpid)
    return chilpid
  
  def kill(self, childpid):
    if childpid in self._childs:
      # Si no esta en la lista es que ya se habra muerto.
      os.kill(childpid,signal.SIGTERM)

-------------- fin codigo -----------------------
(Este codigo no lo he ejecutado, solo es una idea)

Ademas me parece que con python 2.4 habian añadido algo para manejo de 
subprocesos (modulo subprocess) que se supone multiplataforma (osea, que 
funciona en Güindous), pero aun no lo he mirado.

Bueno, creo que ya es bastante por ahora, si  sirbe, aqui esta.
Si hay dudas preguntar, que si se sabe y puede, se contestar.

Un saludo
Joaquin.



El Viernes, 3 de Junio de 2005 17:22, Pepe Aracil escribió:
> El Viernes, 3 de Junio de 2005 11:12, Julio Canto escribió:
> > pepe wrote:
> > >Hola
> > >Estoy  haciendo una cola de trabajos en red, ya he conseguido lanzar mas
> > > o menos los trabajos. El servidor  será  "el padre" y los "hijos" seran
> > > los trabajos lanzados. Mi duda es que pasos he de seguir para antes de
> > > lanzarlos a ejecutar saber el pid del hijo(trabajo lanzado)  para poder
> > > hacer un kill. Otra duda que tengo es komo puedo saber si aun se esta
> > > ejecutando un trabajo para ver si he de liberarlo y ponerlo como un
> > > nodo libre.
> >
> > Los 'threads' no los puedes matar. Lo que puedes hacer es meterles algun
> > mecanismo interno para comunicarles que 'se mueran' ellos solos (p.e.
> > una propiedad que tu puedas modificar desde fuera del objeto, y que
> > dicho objeto consulte durante el desarrollo de su actividad para saber
> > si debe continuar). Un thread es un objeto, y puedes llamar al metodo
> > 'isAlive' para saber si esta muerto o no.
> >
> > Un saludo,
> >     JC
> > _______________________________________________
> > Python-es mailing list
> > Python-es en aditel.org
> > http://listas.aditel.org/listinfo/python-es
>
> Me parece que se refiere a procesos no a hebras.
>
> No lo he mirado, pero seguro que hay un sistema para lanzar procesos hijos
> y obtener su PID para despues poder "matarlo" o saber si ha muerto solito
> para reemplazarlo por otro proceso de la cola.
>
> Por cierto, yo no soy  el Pepe del post original.
> _______________________________________________
> Python-es mailing list
> Python-es en aditel.org
> http://listas.aditel.org/listinfo/python-es

		
______________________________________________ 
Renovamos el Correo Yahoo! 
Nuevos servicios, más seguridad 
http://correo.yahoo.es




Más información sobre la lista de distribución Python-es