問題タブ [flask-socketio]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
python - Python - スレッドからのFlask-SocketIO送信メッセージ:常に機能するとは限りません
私はクライアントからメッセージを受け取る状況にあります。そのリクエストを処理する関数 (@socketio.on) 内で、重い作業が行われる関数を呼び出したいと思います。これにより、メイン スレッドがブロックされることはありません。クライアントは、作業が完了すると通知されると見なされます。したがって、私は新しいスレッドを開始します。
ここで、非常に奇妙な動作に遭遇しました。メッセージがクライアントに届かないのです。ただし、コードはメッセージが送信される特定の場所に到達します。さらに驚くべきことは、メッセージがクライアントに送信される以外にスレッドで何も起きていない場合、応答が実際にクライアントに到達するという事実です。
要約すると、メッセージが送信される前に計算集約的な何かが発生した場合、メッセージは配信されていません。
こことここで述べられているように、スレッドからクライアントにメッセージを送信することはまったく問題ではありません。
これまでに示したすべての例で、サーバーはクライアントから送信されたイベントに応答します。ただし、一部のアプリケーションでは、サーバーがメッセージの発信元である必要があります。これは、バックグラウンド スレッドなど、サーバーで発生したイベントの通知をクライアントに送信するのに役立ちます。
これがサンプルコードです。コメントのシャープ記号 (#) を削除すると、メッセージ ('foo from thread') はクライアントに到達しません。
Python 3.4.3、Flask 0.10.1、flask-socketio1.2、eventlet 0.17.4 を使用しています。
このサンプルをコピーして .py ファイルに貼り付けると、その動作をすぐに再現できます。
誰かがこの奇妙な振る舞いを説明できますか?
アップデート
eventletのバグのようです。私が行った場合:
インストールされているにもかかわらず、アプリケーションがイベントレットを使用しないように強制します。
ただし、これは、async_mode がバイナリ データの受け入れを拒否するため、「スレッド化」を使用するための適切な解決策ではありません。クライアントからサーバーにバイナリデータを送信するたびに、次のように表示されます。
WebSocket transport not available. Install eventlet or gevent and gevent-websocket for improved performance.
async_mode として gevent を使用する 3 番目のオプションは機能しません。また、gevent はまだ python 3 をサポートしていません。
他の提案はありますか?
python - Flask SocketIO アプリケーションの Heroku sock=backend サーバー要求が中断されました
次の Procfile を使用して、heroku でホストされているフラスコソケットアプリがあります。
socketio に切り替えて以来、アプリの動作に一貫性がありません。以前は、アプリがしばらく実行された後、POST リクエストがタイムアウトし始めていました。
昨日の夜から、エラーが発生し続けます
「バックエンドが HTTP 応答を返す前に、アプリの Web プロセスに属するバックエンド ソケットが閉じられました」という heroku エラー コードの説明を読みました。
しかし、なぜこれが起こるのか、私には見当がつきません。
何を調べるべきかについての手がかりは、これをデバッグするのに役立ちます。
コードを共有することはできますが、そのコードは 300 行の長さであり、エラーの原因がどこにあるのかわからないため、参考になるかどうかわかりません。
python - Flask と eventlet を使用した同時リクエストへの応答
(標準の Flask デバッグ Web サーバーのように) 1 つの要求をブロックして別の要求に応答するのではなく、eventletを使用して同時要求に即座に応答する最小限の Flask アプリケーションをセットアップしようとしています。
前提条件:
これまでにインターネットで見つけたものによる私の理解から、次のように機能するはずです。
このファイルを実行http://localhost:5000/longTask
してから、Web ブラウザのタブで開いhttp://localhost:5000/shortTask
て、.. ただし、これを標準の Werkzeug サーバーで実行する場合と同様に、2 番目のタブは最初のタブが 30 秒後に終了した直後にのみ戻ります。
ここで何が問題なのですか?ところで、予想される同時ユーザー数が少ない (最大 5) ことを考えると、これは一般的に Flask の「本番対応 Web サーバー」と呼ばれるものでしょうか?
ちなみに、Flask-socketio ライブラリを使用して Web サーバーを実行すると、ドキュメントによると、イベントレットがインストールされている場合は自動的に選択され、期待どおりに動作します。
Flask-socketio を使用した完全な例:
python - イベントレットを使用して Flask で socketio を管理する
HTTP および socketio 要求を処理するために小さなサーバーをセットアップしようとしています。サーバーのセットアップ経験はあまりありませんが、現在、apache2 は http を問題なく提供しています。しかし、socketio トランザクションはエラー コード 400 (不正な要求) で失敗し続け、サーバー ログにいくつかの奇妙なエラーが表示されます。engineio エラーが表示され、サーバーが「不正な要求」とコード 400 で応答することがありますが、常にイベントレット サーバーを起動する必要があることが通知されます。
私のサーバー コードはかなり基本的なものです。
そして、Python で書かれた私のクライアント コードは、ドキュメントから直接 socketio-client ライブラリを使用します。
socketio.run(app)
私のためにイベントレットサーバーを起動することになっていませんか? サーバーが不正なリクエストを返すのはなぜですか (時々)?
flask-socketio - サーバー間通信
2 つ (またはそれ以上) のフラスコソケットサーバー間で直接通信する方法があるかどうか知りたいです。サーバー間で情報を渡し、クライアントに単一の Web ソケット サーバーを接続させたいと考えています。これにより、他のサーバーからのロジックとデータがすべて結合されます。
この例は、JS Socket IO Server to Serverで見つけました。解決策は、socket.io-client を使用して別のサーバーに接続することでした。
Flask-SocketIO のドキュメントやその他のリソースを調べましたが、Flask-SocketIO にクライアント コンポーネントが含まれているようには見えません。
提案やアイデアはありますか?
python - Python の非ブロッキング サブプロセス出力読み取りがすべての出力をキャプチャしない
誰かがこれを手伝ってくれることを願っています:
問題は、これが機能しているように見えますが、traceroute コマンドのすべての出力がキャプチャされておらず、その一部のみがキャプチャされていることです。
私はこれのほとんどをウェブで見つけたので、完全には理解していません。
基本的に私はそれを作ろうとしているので、バックグラウンドで traceroute コマンドを実行し、そこから出力を取得したら、それを Web ソケット (socketio) からブラウザーに送信したいと考えています。
しかし、他のアクションをブロックしたくありません。
それが誰かの助けになるなら、私はPython Flask/Geventを使用しています。