duda de threads

Antonio Castro acastro en ciberdroide.com
Mar Sep 28 09:47:22 CEST 2004


On Tue, 28 Sep 2004, zako wrote:

> 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,

Ciertos recursos que usan los procesos deben ser liberados por el proceso
padre. Si eso no ocurre quedan en ese estado. Una cosa son los thread y
otra los procesos creados con fork(). El proceso padre debe recoger los
restos de su hijo para darle una sepultura decente. Se hace con las llamadas
al sistema wait(2), waitpid(2). Si eso no ocurre (Por ejemplo al padre no
le apetece enterrar a un hijo que tuvo que matar porque no paraba de hacer
'kaka'), el hijo quedará entonces en el limbo de los zombis.

En el caso de los threads te basta con saber cuando ha de finalizar cada
hilo. Los hilos se pueden comunicar por medio de variables globales.
Puedes usar con una variable global que indique si hay que finalizar o no.



-- 
Un saludo
Antonio Castro

       /\     /\
         \\W//
        _|0 0|_
+-oOOO-(___o___)-OOOo---------------------+
| . . . . U U . Antonio Castro Snurmacher |
| . . . . . . . acastro en ciberdroide.com   |
+()()()---------()()()--------------------+




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