Hace poco estuve leyendo this document que enumera una serie de estrategias que podrían emplearse para implementar un servidor de socket. Es decir, ellos son:Escribir un servidor basado en socket en Python, ¿estrategias recomendadas?
- servir a muchos clientes con cada hilo, y el uso sin bloqueo de E/S y la notificación disposición disparado por nivel
- servir a muchos clientes con cada hilo, y el uso sin bloqueo O y la disposición de notificación de cambio de E/
- servir a muchos clientes con cada hebra del servidor, y utilizar e/S asíncrona
- servir a un cliente con cada hebra del servidor, y utilizar el bloqueo de e/S
- Construir el código del servidor en el núcleo
Ahora, agradecería una pista sobre la cual debería usarse en CPython, que sabemos tiene algunos puntos buenos y algunos puntos malos. Estoy interesado principalmente en el rendimiento bajo alta concurrencia, y sí, varias implementaciones actuales son demasiado lentas.
Así que si empiezo con el fácil, "5" está fuera, ya que no voy a piratear nada en el kernel.
"4" También parece que debe estar fuera debido a la GIL. Por supuesto, podría usar multiprocesamiento en lugar de hilos aquí, y eso da un impulso significativo. El bloqueo de IO también tiene la ventaja de ser más fácil de entender.
Y aquí mi conocimiento se desvanece un poco:
"1" es tradicional de selección o un sondeo que podría ser trivialmente combina con multiprocesamiento.
"2" es la notificación de cambio de la disposición, que utiliza el nuevo epoll y kqueue
"3" No estoy seguro de que hay cualquier implementación del kernel para este que tienen envolturas de Python.
Por lo tanto, en Python tenemos una bolsa de herramientas geniales como Twisted. Tal vez sean un mejor enfoque, aunque he comparado Twisted y lo encontré demasiado lento en una máquina con múltiples procesadores. Tal vez tener 4 torceduras con un equilibrador de carga podría hacerlo, no lo sé. Cualquier consejo sería apreciado.
Creo que epoll está en el stdlib en 2.6+, y easy_installable para 2.5. El paquete se llama select-something. Perdón por la vaguedad. –
Twisted también puede usar epoll. De hecho, Twisted convierte todas las API de notificación de eventos admitidas en una API uniforme que te presenta. Entonces, si lo mejor que puede hacer la plataforma es seleccionar, su aplicación usa select. Si tiene epoll, tu aplicación usa epoll. Todo de forma transparente para ti. –
Se deletrea 'asyncore' – new123456