私は Flask Web アプリを使用しており、実行時間の長い (> 1 分) タスクがいくつかあります。これらをフラスコからオフロードし(Webサーバーのブロックなど)、外部タスクに移動したいと思います。Celery をセットアップして、Flask からこれらのタスクを実行できます。良い。
タスクが完了したときにユーザーに通知し、結果を返すために、Web ソケットを使用したいと考えました。ここが難しいところです。
クライアントが接続する gevent websocket サーバーが実行されています。セロリ タスクを起動するときに、クライアントのセッション ID を渡します。これにより、結果を取得したときに、そのタスクが誰のものであるかがわかります。
ここで、これらのタスクがいつ完了したかを Websocket サーバーが認識し、結果を見て、適切な接続に送信する必要があります。
どのように?これは私が完全に迷子になるところです。でセロリ イベントをリッスンできますcelery.events.EventListener.capture
が、これにより WebSocket サーバーがブロックされるため、複数の接続を確立できません。
ブロックせずにセロリイベントをリッスンするにはどうすればよいですか?
1 つのアイデアは、Web ソケット経由で要求を行い、WebSocket サーバーからセロリ タスクを起動することです。これで通知の問題は解決しますが(セロリイベントを使用しただけです)、標準のフラスコサーバーに対してリクエストが行われた元の質問にまだ興味があります。