duda de threads

zako ezako en yahoo.es
Mar Sep 28 01:37:54 CEST 2004


On Mon, Sep 27, 2004 at 12:08:45PM -0700, Mauricio Flores Olmos wrote:
> Solo una idea, no se mucho de threads ni python en general, pero... ya 
> que es un servidor TCP y puede recibir peticiones de algun tipo, puedes 
> poner una especial para que el thread finalice cuando se le mande esa 
> peticion... o de algun modo que revise alguna propiedad con un valor 
> TRUE FALSE, y se este ejecutando mientras la propiedad sea TRUE y 
> termine cuando sea FALSE.
> Es algo que he utilizado con timers y con metodos de lectura de 
> dispositivos (en otros lenguajes por cierto, estoy investigando como se 
> hace en python), y asi le hago para terminar los procesos en ejecucion.

aupa,

le he estado dando un par de vueltas y creo que seria complicado. En realidad
utilizo el servidor SOAP del paquete SOAPpy. Se pueden definir funciones (RPC)
SOAP, pero las excepciones lanzadas en esas funciones son entendidas como
excepciones del protocolo SOAP y generan mensajes de error SOAP, no son
manejadas por el servidor SOAP. En su caso, deberia modificar el servidor SOAP
para crear una peticion especial con la que pueda cerrar el hilo y creo que
eso se me escapa de mis conocimientos newbies de Python.

Como segunda opcion, ya que no puedo cerrar un hilo desde otro hilo, he decido
usar procesos y señales. Sin embargo, es curioso como al mandar al hijo una
señal SIGTERM este se queda "zombi" y no es eliminado hasta que finaliza el
proceso padre. Esto me ha parecido muy raro y os incluyo el programa que he
hecho para testearlo.


#############################################################################
#!/usr/bin/env python

import os, sys, signal, time

pid = os.fork()

if pid != 0:
    # proceso padre,
    print 'Soy el proceso padre. el hijo tiene el pid: %s.' % str(pid)
    os.system('ps aux | grep python')
    raw_input('Pula una tecla par matar al proceso hijo -> ')
    os.kill(pid, signal.SIGTERM)
    os.system('ps aux | grep python')
    raw_input('Se ha matado el hijo y queda zombi!!!.\
    Pulsa para finalizar el programa -> ')
else:
    # proceso hijo.
    while 1:
        time.sleep(5)
        print 'Kaka'
#############################################################################


Al ejecutarlo el segundo os.system(...) muestra como el proceso hijo se haya
zombi. No se si tendre algo mal en el código o es que los procesos funcionan
asi en Python. Saludos,

zako




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