比較的長時間にわたるタスクは、別のサーバー上で別々に実行されているセラーワーカーに委任されます。Flaskでコミットが成功した後にセロリタスクを実行しますか?
しかし、結果はリレーショナルデータベースに戻されます(task_descr.id
に従って更新されたテーブル、以下を参照)。ワーカーはignore_result
を使用します。フラスコアプリケーションから要求された
タスク:
task = app.celery.send_task('tasks.mytask', [task_descr.id, attachments])
問題は、トランザクションがまだフラスコ側で閉じられていない状態での作業が要求されていることです。これは競合状態を引き起こします。これは、Flaskアプリでトランザクションが終了する前にセルリーワーカーがタスクを完了することがあるためです。
トランザクションが成功した後にタスクを送信する適切な方法は何ですか?
また、条件を試行する前に、作業者がtask_descr.id
の使用可能性をチェックし、タスクを再試行する必要があります(これは複雑すぎます)。
回答はRun function after a certain type of model is committedと似ていますが、ここでのタスク送信は明示的なので、一部のモデルでは更新/挿入を聞く必要はありません。