duda de threads

Joaquin Jose del Cerro Murciano jjdelcerro en cenoclap.es
Mar Sep 28 11:43:46 CEST 2004


El Martes, 28 de Septiembre de 2004 01:37, zako escribió:
> 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,
>

En relacion con lo de los zombies, por lo que recuerdo de hace mucho tiempo, 
el programa padre deberia atrapar la señal SIGCHLD para que el hijo no se
quedase zombi al morir. 

podria hacerse algo como:

signal.signal(signal.SIGCHLD,signal.SIG_IGN)

antes del fork. Pero... (casi siempre hay un pero)
El problema que he visto es que el comando signal de python
parece que esta basado en la funcion signal de C, y esta funcion
deja sin especificar que hacer con los zombies (problemas de definicion
del interface POSIX de la funcion signal), por lo que segun
sistemas puede serte suficiente o no (a mi, con un FreeBSD no me
es suficiente). 
En caso de que no sea suficiente habria que usar, la funcion sigaction
del sistema (te recomiendo que ojees el man sigaction), pero el problema
que a bote pronto me he encontrado es que no he visto esta funcion
en python.

Bueno, siento no serte de mas ayuda pero si alguien sabe de como
invocar a sigaction desde python de forma simple ya contara como hacerlo.

Un saludo
Joaquin

> zako
> _______________________________________________
> Python-es mailing list
> Python-es en aditel.org
> http://listas.aditel.org/listinfo/python-es

-- 




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