作成AsyncResult
タスクidからオブジェクトはあるに推奨される方法よくある質問あなたが持っている唯一のものは、タスクIDであるとき、タスクのステータスを取得します。
ただし、Celery 3.xの時点では、注意を払わないと人を傷つける可能性のある重要な警告があります。それは本当に特定のユースケースシナリオに依存します。
デフォルトでは、Celeryは「実行中」の状態を記録しません。
Celeryでタスクの実行を記録するには、に設定task_track_started
する必要がありますTrue
。これをテストする簡単なタスクを次に示します。
@app.task(bind=True)
def test(self):
print self.AsyncResult(self.request.id).state
ときtask_track_started
でFalse
デフォルトである、状態のショーがあるPENDING
タスクが開始されているにもかかわらず。に設定task_track_started
するTrue
と、状態はSTARTED
。
状態 PENDING
は「わからない」という意味です。
AsyncResult
状態を持ちますPENDING
ないセロリは、タスクのステータスを知らない以上という意味では何もしません。これには、さまざまな理由が考えられます。
1 AsyncResult
つには、無効なタスクIDを使用して構築される可能性があります。そのような「タスク」は、Celeryによって保留中と見なされます。
>>> task.AsyncResult("invalid").status
'PENDING'
では、明らかに無効なIDをにフィードする人は誰もいませんAsyncResult
。十分に公平ですAsyncResult
が、実行には成功したが、Celeryが存在することを忘れてしまったタスクも考慮するPENDING
効果があります。繰り返しになりますが、一部のユースケースでは、これが問題になることがあります。問題の一部は、結果のバックエンドでの「墓石」の可用性に依存しているため、Celeryがタスクの結果を保持するように構成されている方法に依存しています。使用方法(「墓石には」データチャンクのためのセロリドキュメントの長期使用は、タスクが終了したか記録が。ということである)AsyncResult
、すべての場合では動作しませんtask_ignore_result
ISTrue
。さらに厄介な問題は、Celeryがデフォルトでトゥームストーンを期限切れにすることです。のresult_expires
デフォルトの設定は24時間に設定されています。したがって、タスクを起動し、長期保存でIDを記録し、さらに24時間後に、それを使用しAsyncResult
てを作成すると、ステータスはになりますPENDING
。
すべての「実際のタスク」はそのPENDING
状態から始まります。したがってPENDING
、タスクを取得することは、タスクが要求されたが、(何らかの理由で)これより先に進むことはなかったことを意味する場合があります。または、タスクは実行されたがセロリがその状態を忘れたことを意味する場合があります。
痛い!AsyncResult
うまくいきません。他に何ができますか?
タスク自体を追跡するよりも、目標を追跡することを好みます。私はいくつかのタスク情報を保持していますが、それは目標を追跡することの本当に二次的なものです。目標はセロリから独立したストレージに保存されます。要求が計算を実行する必要がある場合、達成されたいくつかの目標に依存し、目標がすでに達成されているかどうかをチェックし、達成されている場合は、このキャッシュされた目標を使用します。それ以外の場合は、目標に影響を与えるタスクを開始し、 HTTPリクエストを、結果を待つ必要があることを示す応答であるクライアント。
上記の変数名とハイパーリンクは、Celery 4.x用です。3.xでは、対応する変数やハイパーリンクは以下の通りですCELERY_TRACK_STARTED
、CELERY_IGNORE_RESULT
、CELERY_TASK_RESULT_EXPIRES
。
x
ますか?