3

私は Flask Web アプリを使用しており、実行時間の長い (> 1 分) タスクがいくつかあります。これらをフラスコからオフロードし(Webサーバーのブロックなど)、外部タスクに移動したいと思います。Celery をセットアップして、Flask からこれらのタスクを実行できます。良い。

タスクが完了したときにユーザーに通知し、結果を返すために、Web ソケットを使用したいと考えました。ここが難しいところです。

クライアントが接続する gevent websocket サーバーが実行されています。セロリ タスクを起動するときに、クライアントのセッション ID を渡します。これにより、結果を取得したときに、そのタスクが誰のものであるかがわかります。

ここで、これらのタスクがいつ完了したかを Websocket サーバーが認識し、結果を見て、適切な接続に送信する必要があります。

どのように?これは私が完全に迷子になるところです。でセロリ イベントをリッスンできますcelery.events.EventListener.captureが、これにより WebSocket サーバーがブロックされるため、複数の接続を確立できません。

ブロックせずにセロリイベントをリッスンするにはどうすればよいですか?

1 つのアイデアは、Web ソケット経由で要求を行い、WebSocket サーバーからセロリ タスクを起動することです。これで通知の問題は解決しますが(セロリイベントを使用しただけです)、標準のフラスコサーバーに対してリクエストが行われた元の質問にまだ興味があります。

4

1 に答える 1

2

キャプチャ呼び出しでブロックしないようにするには、フラスコアプリが必要です。解決策の 1 つは、gevent または eventlet を使用してフラスコを実行し、プロセスが要求を非同期に処理し、呼び出しをブロックしてもプロセスがブロックされないようにすることです。

これについては、例を挙げるとたくさんの例があります: https://gist.github.com/lrvick/1185629

于 2013-08-23T11:01:07.217 に答える