2014-04-16 11 views
28

Ich bin der Erforschung derzeit websocket Unterstützung in Python und bin ein wenig verwirrt mit dem Angebot.Websockets in Flask

Auf der einen Seite ist es möglich, Flask + gevent zu verwenden. Auf der anderen Seite hat uwsgi socket support und schließlich gibt es eine Erweiterung, die beide uwsgi and gevent bündelt.

Was ist das Problem mit WebSockets mit nur einer dieser Umsetzung? Was gewinne ich, indem ich sie mische?

Ändern der Frage

Was bedeutet das Hinzufügen GEVENT das tun Gewinde uwsgi nicht?

+0

Es ist eine Erweiterung von Kenneth Reitz dem Namen „Flask-Sockets“ geschrieben, die für WebSockets ausgezeichnet. Hör zu. https://github.com/kennethreitz/flask-sockets – codegeek

+1

Danke, aber ich bin auch daran interessiert, die Rolle von gevent in diesem Durcheinander herauszufinden. – ruipacheco

+0

würde ich sagen, weil es ein asynchrones ist. Da ist also für einen einzelnen Arbeiter nicht nur ein einziger Kunde beschäftigt. –

Antwort

63

In regelmäßigen HTTP-Anfragen die Verbindungen zwischen Client und Server sind kurzlebig, ein Client eine Verbindung zu dem Server sendet eine Anforderung, 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 Arbeitern bedienen. Das Nebenläufigkeitsmodell in dieser Situation basiert typischerweise auf Threads, Prozessen oder einer Kombination von beidem.

Wenn Sie Websocket verwenden, ist das Problem komplexer, weil eine Websocket-Verbindung für eine lange Zeit geöffnet ist, so dass der Server nicht einen kleinen Pool von Arbeitern verwenden kann, um eine große Anzahl von Clients zu bedienen ein eigener engagierter Arbeiter. Wenn Sie Threads und/oder Prozesse verwenden, wird Ihre App nicht skaliert, um eine große Anzahl von Clients zu unterstützen, da Sie keine große Anzahl von Threads/Prozessen haben können. Diese

ist, wo GEVENT das Bild eintritt. Gevent verfügt über ein Concurrency-Modell, das auf Greenlets basiert und viel besser skaliert als Threads/Prozesse. Durch die Verwendung von Web-Socket-Verbindungen mit einem geventbasierten Server können Sie aufgrund des geringen Gewichts von Greenlets mehr Clients unterstützen. Mit uWSGI haben Sie die Wahl zwischen Concurrency-Modellen, die mit Web-Sockets verwendet werden können. Dazu gehört auch das Greenlet-basierte Modell von gevent. Sie können auch den Web-Server von gevent verwenden, wenn Sie möchten.

Aber das GEVENT beachten Sie nichts über Web-Sockets wissen, ist es nur ein Server. Um Websocket-Verbindungen zu verwenden, müssen Sie eine Implementierung des Websocket-Servers hinzufügen.

Es gibt zwei Erweiterungen für Fläschchen, 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 Verlängerung (schamlose Werbung, wie ich der Autor bin) ist ein Wrapper für GEVENT und GEVENT-socketio auf dem Server plus Socket.IO auf dem Client. Socket.IO ist ein Socket-Protokoll auf höherer Ebene, das den Web-Socket verwenden kann, sofern verfügbar, aber auch andere Transportmechanismen in älteren Browsern verwenden kann.

Ich hoffe, das hilft!

+0

@Miguel - Wie führe ich Socket.IO, wenn ich einen Manager verwende? Kann nicht die vorgeschriebene - socketio.run (app) – moaglee

+0

@ moaglee Ich verstehe dein Problem nicht. Möchten Sie eine separate Frage mit allen Details schreiben? – Miguel