データベース層との通信にセロリを使用する必要があるという、異常な要件を受け取りました。
アプリケーションは、バックエンドでFlaskとMongoDBを使用し、フロントエンドでAngularを使用しています。
スポンサーは、私がタスクを実行し、ワーカーの1人にデータをMongoに出入りさせて、結果を取り戻すことができると信じています。
私の知る限り、セロリタスクを同期的に(__call__
またはを使用してapply
)呼び出すと、タスクはデータベースに送信されるのではなく、ローカルで実行されます。非同期で呼び出す場合は、Flask側でブロックし、結果またはエラーが返されるまでタスクキューをポーリングし続ける必要があります。
別のアプローチは、非同期呼び出しを行うようにREST APIを変更することです(タスクIDをすぐに返し、クライアント側で結果をポーリングし続けます。個人的には、これは基本的なCRUD操作のようにミリ秒範囲のタスクを探すのはばかげています。
task.delay
同期呼び出しのように見せながら、ワーカーの1人がタスクを実行できるようにするために、洗練された方法でラップする方法はありますか?
はい、あります-私AsyncResult.get
がドキュメントでどのように逃したのかわかりません:
AsyncResult.get(timeout=None, propagate=True, interval=0.5)
タスクの準備ができるまで待ち、その結果を返します。
したがって、タスクを次のように呼び出すだけです。
task.delay(args).get(timeout=1)
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加