¿Asyncore o Threading?

Gabriel Genellina gagsl-py2 en yahoo.com.ar
Mar Mayo 1 04:05:52 CEST 2007


En Mon, 30 Apr 2007 14:06:24 -0300, Pepe Aracil <pepe en diselpro.com>  
escribió:

> Quiero implementar una clase para atender las peticiones
> del protocolo fastAGI que es como un fastCGI pero para
> el software PBX Asterisk.
>
> Resulta que el módulo Asynchat no me termina de cuadrar porque
> la implementación de esta aplicación en cuestión no encaja bien
> en el modelo de programación orientada a eventos.
>
> ¿Que ventajas si es que existen en cuanto a optimización tiene
> una lectura usando select (asyncore) como disparador en lugar de
> un thread con una lectura bloqueante?

Usar threads de por sí es problemático: consumen recursos, generan  
problemas de sincronización, no todas las librerias estan pensadas para  
ser usadas concurrentemente, no existen threads en todas las plataformas.
Por otro lado, asyncore "desarma" la logica de la aplicacion en multiples  
eventos que pueden ser dificiles de entender aislados; los handlers de  
cada evento deben ser cortos (en tiempo) sino se te estira el tiempo de  
respuesta del sistema; pero no tiene problemas de concurrencia porque todo  
se ejecuta en un unico thread, y asyncore esta disponible en casi  
cualquier plataforma.

Si estas previendo que haya muchas peticiones simultaneas, puede ser mas  
eficiente asyncore; pero si la carga es poca puede ser mas facil de  
escribir usando threads.

Tambien existe la opcion combinada: usar asyncore para manejar las  
conexiones de red, con handlers cortos, y cuando se recibio todo lo  
necesario para procesar el pedido, disparar un thread separado que hace el  
trabajo "de verdad" y avisa cuando termina de generar la respuesta. De esa  
manera no se afecta tanto el tiempo de respuesta de las demas conexiones.

> Lo pregunto, porque si es mejor el select (asyncore), entonces  
> implementaría
> un thread que se encargase de atender todos los sockets y que lanzase el  
> loop
> principal del módulo asyncore.

El programa deberia tener un unico loop de eventos, usualmente en el  
thread principal - especialmente si hay una interfase grafica aunque creo  
que no es tu caso -.

-- 
Gabriel Genellina

------------ próxima parte ------------
_______________________________________________
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