websockets python websocket flask uwsgi gevent

websockets - websocket documentation python



Websockets en Frasco (1)

En las solicitudes HTTP regulares, las conexiones entre el cliente y el servidor son efímeras, un cliente se conecta al servidor, envía una solicitud, recibe la respuesta y luego cierra la conexión. En este modelo, el servidor puede atender a una gran cantidad de clientes que utilizan una pequeña cantidad de trabajadores. El modelo de concurrencia en esta situación generalmente se basa en hilos, procesos o una combinación de ambos.

Cuando usas websocket, el problema es más complejo, porque una conexión de websocket está abierta durante un largo período de tiempo, por lo que el servidor no puede usar un pequeño grupo de trabajadores para atender a un gran número de clientes, cada cliente necesita obtener su propio trabajador dedicado . Si utiliza subprocesos y / o procesos, entonces su aplicación no se escalará para admitir una gran cantidad de clientes porque no puede tener una gran cantidad de subprocesos / procesos.

Aquí es donde gevent entra en escena. Gevent tiene un modelo de concurrencia basado en áreas verdes, que escalan mucho mejor que los procesos / hilos. Así que servir conexiones de websocket con un servidor basado en gevent le permite soportar más clientes, debido a la naturaleza liviana de los greenlets. Con uWSGI tiene una opción de modelos de concurrencia para usar con sockets web, y eso incluye el modelo basado en greenlet de gevent. También puede usar el servidor web de gevent independiente si lo desea.

Pero tenga en cuenta que gevent no sabe nada sobre sockets web, es solo un servidor. Para usar conexiones websocket, debe agregar una implementación del servidor websocket.

Hay dos extensiones para Flask que simplifican el uso de websockets. La extensión github.com/kennethreitz/flask-sockets de Kenneth Reitz es un contenedor para gevent y gevent-websocket. La extensión Flask-SocketIO (plug shameless, ya que soy el autor) es un contenedor para gevent y gevent-socketio en el servidor, además de Socket.IO en el cliente. Socket.IO es un protocolo de socket de nivel superior que puede usar un socket web si está disponible pero también puede usar otros mecanismos de transporte en navegadores más antiguos.

¡Espero que esto ayude!

Actualmente estoy investigando el soporte de websocket en Python y estoy un poco confundido con las ofertas.

Por un lado, es posible usar Flask + gevent . Por otro lado, uwsgi tiene soporte para socket y por fin hay una extensión que agrupa a uwsgi y gevent .

¿Cuál es el problema con la implementación de websockets con solo uno de estos? ¿Qué gano al mezclarlos?

Cambiando la pregunta

¿Qué significa agregar gevent que roswell uwsgi no lo hará?