David Villa escribió:
On Thu, 11 Mar 2010 09:51:40 +0100
Pepe Aracil <p...@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.
_______________________________________________
Python-es mailing list
Python-es@python.org
http://mail.python.org/mailman/listinfo/python-es
FAQ: http://python-es-faq.wikidot.com/