serve_forever

Pepe Aracil pepe en diselpro.com
Jue Mayo 22 14:35:55 CEST 2008


Hola

Si te miras los fuentes del módulo Socketserver
y en concreto de la clase BaseServer, veras esto:

-- code --
def serve_forever(self):
         """Handle one request at a time until doomsday."""
         while 1:
             self.handle_request()
------

Solo tienes que crear una clase derivada de TCPServer y
sobreescribir el método server_forever.

------ code --
def serve_forever(self):
         """Handle one request at a time until exit_flag."""
         while not exit_flag:
             self.handle_request()
------


Salud.





Oswaldo Hernández escribió:
> Alejandro Bermudez Aragurz escribió:
>> Oswaldo Hernández escribió:
>>> >Luis Garcia Merino escribió:
>>>>> ----- Original Message ----
>>>>> From: Oswaldo Hernández <listas en soft-com.es>
>>>>> To: Lista de discusión sobre python en castellano 
>>>>> <python-es en aditel.org>
>>>>> Sent: Thursday, May 22, 2008 10:38:33 AM
>>>>> Subject: [Python-es] serve_forever
>>>>>
>>>>> Hola,
>>>>>
>>>>> En una aplicacion utilizo el modulo SocketServer.ThreadingTCPServer 
>>>>> el cual me funciona muy bien.
>>>>>
>>>>> El problema con el que me encuentro es con el metodo serve_forever. 
>>>>> Este metodo, como su nombre indica, maneja las conexiones entrantes 
>>>>> de una forma muy bien explicada en su doc:
>>>>>
>>>>>          """Handle one request at a time until doomsday."""
>>>>>
>>>>> Bueno, el problema con el que me encuentro es ese, como detener el 
>>>>> servidor desde otro thread. No encuantro ningúm metodo para ello en 
>>>>> el modulo.
>>>>>
>>>>> He probado a cerrar el socket del servidor, pero no termina de 
>>>>> funcionar bien puesto que hasta que el servidor necesite utilizarlo 
>>>>> no salta la excepción, posiblemente sea debido a que el cierre se 
>>>>> realiza desde otro thread.
>>>>>
>>>>> Finalmente he conseguido hacerlo de una forma un tanto chapucera, 
>>>>> pero la pregunta es:
>>>>>
>>>>> ¿Alguien sabe como finalizar el servidor de una forma limpia?
>>>>>
>>>
>>> >
>>> >
>>> >no lo he hecho, pero supongo que puedes programar el servidor para 
>>> que al recibir determinada orden >a través del socket se termine la 
>>> ejecución con server_close()... imagino que también podría >hacerse 
>>> con kill y subprocess... aunque creo que la primera opción es más 
>>> "limpia", pero no sé si >lo suficientemente limpia para ti  :)
>>>
>>>
>>> ThreadingTCPServer crea automaticamente un nuevo thread con su 
>>> manejador cuando recibe una conexión, este manejador puede recibir el 
>>> mensaje de cierre y finalizrse a si mismo, pero continuo con el mismo 
>>> problema de finalizar el thread del servidor.
>>>
>>> Sobre el kill, no ver forma de hacer kill a un thread.
>>>
>>> Saludos,
>>>
>>>
>>>
>> Yo lo solucione de una forma muy "guarra":
>>
>>    Tienes una clase thread(o heredada de esta) donde se arranca el 
>> servidor.
>>
>>    Desde otra clase(o en el main del modulo, a omo lo quieras 
>> organizar), se arranca el hilo anteriomente mencionado, y se queda en 
>> bucle infinito esperando señal de apagado(la presencia de un archivo, 
>> pulsacion de ctrl+c, etc). Cuando eso ocurre, matas tu propio proceso 
>> con kill.
> 
> El problema que tengo es que la aplicación es un servicio de windows, y 
> debo respetar las normas de arranque y parada del servicio, y por lo 
> tanto, finalizar los procesos de la forma mas limpia posible.
> Lo tengo solucionado de una forma no se si tan guarra como la tuya ;)
> 
> La pregunta va principalmente por si se me escapa algo, no se, que 
> ThreadingTCPServer tenga algo para finalizar que no este documentado, se 
> le pueda enviar algun tipo de señal para que se detenga ????.
> 
> 
> 
_______________________________________________
Lista de correo Python-es 
http://listas.aditel.org/listinfo/python-es
FAQ: http://listas.aditel.org/faqpyes





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