web-dev-qa-db-fra.com

Websockets dans Flask

Je recherche actuellement le support de websocket dans Python et je suis un peu confus avec les offres.

D'une part, il est possible d'utiliser Flask + gevent . D'un autre côté, uwsgi a prise en charge de socket et enfin il y a une extension qui regroupe à la fois wsgi et gevent .

Quel est le problème avec l'implémentation de websockets avec un seul d'entre eux? Qu'est-ce que je gagne en les mélangeant?

Modification de la question

Qu'est-ce que l'ajout de gevent fait que les uwsgi filetés ne feront pas?

43
ruipacheco

Dans les requêtes HTTP régulières, les connexions entre le client et le serveur sont de courte durée, un client se connecte au serveur, envoie une requête, reçoit la réponse, puis ferme la connexion. Dans ce modèle, le serveur peut servir un grand nombre de clients en utilisant un petit nombre de travailleurs. Le modèle de concurrence dans cette situation est généralement basé sur des threads, des processus ou une combinaison des deux.

Lorsque vous utilisez websocket, le problème est plus complexe, car une connexion websocket est ouverte pendant une longue période, de sorte que le serveur ne peut pas utiliser un petit pool de travailleurs pour servir un grand nombre de clients, chaque client doit obtenir son propre travailleur dédié . Si vous utilisez des threads et/ou des processus, votre application ne sera pas mise à l'échelle pour prendre en charge un grand nombre de clients car vous ne pouvez pas avoir un grand nombre de threads/processus.

C'est là que gevent entre en scène. Gevent a un modèle de concurrence basé sur les greenlets, qui évoluent beaucoup mieux que les threads/processus. Donc, servir des connexions websocket avec un serveur basé sur gevent vous permet de prendre en charge plus de clients, en raison de la nature légère des greenlets. Avec uWSGI, vous avez le choix entre des modèles de concurrence à utiliser avec les sockets Web, et cela inclut le modèle basé sur greenlet de gevent. Vous pouvez également utiliser le serveur Web de gevent de façon autonome si vous le souhaitez.

Mais notez que gevent ne sait rien des sockets web, c'est juste un serveur. Pour utiliser les connexions websocket, vous devez ajouter une implémentation du serveur websocket.

Il existe deux extensions pour Flask qui simplifient l'utilisation des websockets. L'extension Flask-Sockets par Kenneth Reitz est un wrapper pour gevent et gevent-websocket. Le - Flask-SocketIO extension (plug sans vergogne dont je suis l'auteur) est un wrapper pour gevent et gevent-socketio sur le serveur, plus Socket.IO sur le client. Socket.IO est un protocole de socket de niveau supérieur qui peut utiliser le socket web s'il est disponible mais peut également utiliser d'autres mécanismes de transport sur les anciens navigateurs.

J'espère que ça aide!

93
Miguel