webentwicklung-frage-antwort-db.com.de

Websockets in Flask

Ich recherchiere derzeit nach Websocket-Unterstützung in Python und bin ein bisschen verwirrt mit den Angeboten.

Einerseits ist es möglich, Flask + gevent zu verwenden. Auf der anderen Seite hat uwsgi Socket-Unterstützung und endlich gibt es eine Erweiterung, die beide bündelt wsgi und gevent .

Was ist das Problem bei der Implementierung von Websockets mit nur einem davon? Was gewinne ich, wenn ich sie mische?

Ändern der Frage

Was bewirkt das Hinzufügen von gevent, wenn uwsgi mit Threads nicht ausgeführt wird?

43
ruipacheco

Bei normalen HTTP-Anfragen sind die Verbindungen zwischen Client und Server von kurzer Dauer, ein Client stellt eine Verbindung zum Server her, sendet eine Anfrage, empfängt die Antwort und schließt dann die Verbindung. In diesem Modell kann der Server eine große Anzahl von Clients mit einer kleinen Anzahl von Workern bedienen. Das Parallelitätsmodell in dieser Situation basiert normalerweise auf Threads, Prozessen oder einer Kombination aus beiden.

Wenn Sie Websocket verwenden, ist das Problem komplexer, da eine Websocket-Verbindung über einen langen Zeitraum geöffnet ist. Daher kann der Server nicht einen kleinen Pool von Mitarbeitern verwenden, um eine große Anzahl von Clients zu bedienen. Jeder Client benötigt einen eigenen dedizierten Mitarbeiter . Wenn Sie Threads und/oder Prozesse verwenden, wird Ihre App nicht für die Unterstützung einer großen Anzahl von Clients skaliert, da Sie keine große Anzahl von Threads/Prozessen haben können.

Hier kommt gevent ins Spiel. Gevent hat ein Parallelitätsmodell, das auf Greenlets basiert, die viel besser skaliert werden als Threads/Prozesse. Wenn Sie Websocket-Verbindungen mit einem Server auf der Basis von gevent bereitstellen, können Sie aufgrund des geringen Gewichts von Greenlets mehr Clients unterstützen. Mit uWSGI haben Sie die Wahl zwischen Parallelitätsmodellen für Web-Sockets, einschließlich des Greenlet-basierten Modells von gevent. Sie können den Web-Server von gevent auch als eigenständige Version verwenden.

Beachten Sie jedoch, dass gevent nichts über Web-Sockets weiß, sondern nur einen Server. Um Websocket-Verbindungen zu verwenden, müssen Sie eine Implementierung des Websocket-Servers hinzufügen.

Es gibt zwei Erweiterungen für Flask, die die Verwendung von Websockets vereinfachen. Die Flask-Sockets -Erweiterung von Kenneth Reitz ist ein Wrapper für gevent und gevent-websocket. Die - Flask-SocketIO Erweiterung (schamloser Stecker, da ich der Autor bin) ist ein Wrapper für gevent und gevent-socketio auf dem Server sowie Socket.IO auf dem Client. Socket.IO ist ein übergeordnetes Socket-Protokoll, das Web-Sockets verwenden kann, sofern verfügbar, aber auch andere Transportmechanismen in älteren Browsern verwenden kann.

Ich hoffe das hilft!

93
Miguel