[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