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