web-dev-qa-db-ja.com

FlaskのWebsocket

私は現在、Python=.

一方では、 Flask + gevent を使用できます。一方、uwsgiには ソケットサポート があり、最後に wsgiとgevent の両方をバンドルする拡張機能があります。

これらの1つだけでWebSocketを実装することの問題は何ですか?それらを混ぜることで何が勝ちますか?

質問の変更

Geventを追加すると、スレッド化されたuwsgiは何をしませんか?

43
ruipacheco

通常のHTTP要求では、クライアントとサーバー間の接続は短命です。クライアントはサーバーに接続し、要求を送信し、応答を受信して​​から接続を閉じます。このモデルでは、サーバーは少数のワーカーを使用して多数のクライアントにサービスを提供できます。この状況での並行性モデルは、通常、スレッド、プロセス、またはその両方の組み合わせに基づいています。

Websocketを使用すると、問題はより複雑になります。websocket接続が長時間開いているため、サーバーが少数のワーカープールを使用して多数のクライアントを処理できないため、各クライアントは専用のワーカーを取得する必要があります。スレッドおよび/またはプロセスを使用する場合、多数のスレッド/プロセスを持つことができないため、アプリは多数のクライアントをサポートするように拡張されません。

これは、geventが写真に入る場所です。 Geventには、グリーンレットに基づいた同時実行モデルがあり、スレッド/プロセスよりもはるかに優れた拡張性を備えています。そのため、geventベースのサーバーでWebSocket接続を提供すると、greenletの軽量性により、より多くのクライアントをサポートできます。 uWSGIでは、Webソケットで使用する同時実行モデルを選択できます。これには、geventのグリーンレットベースのモデルが含まれます。必要に応じて、geventのWebサーバーをスタンドアロンで使用することもできます。

ただし、geventはWebソケットについては何も知らず、単なるサーバーであることに注意してください。 websocket接続を使用するには、websocketサーバーの実装を追加する必要があります。

FlaskにはWebSocketの使用を簡素化する2つの拡張があります。KennethReitzによる Flask-Sockets 拡張は、geventおよびgevent-websocketのラッパーです。 Flask-SocketIO extension(筆者としての恥知らずなプラグイン)は、サーバー上のgeventおよびgevent-socketioのラッパーであり、クライアントでは Socket.IO です。使用可能な場合はWebソケットを使用できるが、古いブラウザーでは他のトランスポートメカニズムも使用できる高レベルのソケットプロトコルです。

これがお役に立てば幸いです!

93
Miguel