[Python-es] Despertar a "select"

Pepe Aracil pepe en diselpro.com
Jue Mar 11 11:41:14 CET 2010


David Villa escribió:
> On Thu, 11 Mar 2010 09:51:40 +0100
> Pepe Aracil <pepe en diselpro.com> osó decir:
>
>  
>> Hola lista.
>>
>> Estoy diseñando un servidor TCP que tendrá que atender cientos de 
>> conexiones simultáneas.
>> La idea es que un thread se encargue de ejecutar un select (módulo 
>> select) pasándole como único parámetro la lista de sockets abiertos a
>> la espera de datos entrantes.
>>
>> Hasta aquí todo está claro, el problema viene cuando desde otro
>> thread quiero añadir nuevos sockets a la lista de sockets que le paso
>> al select. Necesito despertar al select para que recargue la nueva
>> lista.
>>
>> No quiero hacerlo por timeout ya que es una forma bastante
>> ineficiente, ya que si pusiese un timeout de 5 seg. la siguiente
>> lectura de el nuevo socket se demoraría un máximo de 5 seg. y
>> si pongo un timeout muy bajo, estoy echando ciclos de cpu a la basura.
>>
>> Se me ha ocurrido añadir a la lista del select un socket udp con el 
>> único fin de actuar como "despertador" . ¿Alguien tiene una idea
>> mejor?
>>
>> Gracias.
>>     
>
> Hola:
>
> Lo puedes arreglar poniendo el socket «master» también en la lista de
> select(). En [1] tienes un ejemplo mínimo funcional de lo que quieres
> hacer.   
El socket listener  ya lo tengo en la lista del select(), lo que ocurre 
es que los
sockets que quiero añadir a la lista son sockets de conexiones salientes 
a otros
servers, por lo que el socket  listener no se entera de estas acciones.
> De todos modos, select() es una buena forma de controlar
> recursos porque tu programa «no crece» pero no es una buena solución
> si necesitas que escale a cientos de clientes.
La idea es mezclar los mundos síncrono y asíncrono. Threads para hacer 
el trabajo duro y
select para hacer poll de forma eficiente con sockets no bloqueantes.

Digamos que crear un thread por cada conexión es inviable y utilizar un 
único thread con
un  select  y que este thread  se encargue de todo el trabajo  de forma 
secuencial  tambien es inviable o por lo menos mas difícil de 
implementar.  Así que he optado por mezclar los dos sistemas.

Saludos.





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