11

タスク(task_id)がまだセロリで処理されているかどうかをテストするにはどうすればよいですか?次のシナリオがあります。

  1. Djangoビューでタスクを開始します
  2. BaseAsyncResultをセッションに保存します
  3. セロリデーモンを(ハード)シャットダウンして、タスクが処理されないようにします
  4. タスクが「デッド」であるかどうかを確認します

何か案は?セロリによって処理されているすべてのタスクを検索し、私のものがまだそこにあるかどうかを確認できますか?

4

2 に答える 2

3

セロリタスクを格納するフィールド(PickledObjectField)をモデルに定義します。

class YourModel(models.Model):
    .
    .
    celery_task = PickledObjectField()
    .
    .

    def task():
        self.celery_task = SubmitTask.apply_async(args = self.task_detail())
        self.save()

タスクがどのモデルにも固有でない場合は、セロリタスク専用に作成する必要があります。

または、django-celeryを使用することをお勧めします。優れた監視機能があります:
http ://ask.github.com/celery/userguide/monitoring.html#django-admin-monitorは、タスクの詳細をdjangoモデルにグラフィカルな方法で保存します。

于 2011-01-31T03:32:34.713 に答える
0

モデルにタスクオブジェクトを格納するよりも良い方法があると思います。たとえば、タスクのグループ(並列)が完了したかどうかを確認したい場合:

# in the script you launch the task
from celery import group

job = group(
    task1.s(param1, param2),
    task2.s(param3, param4)
)
result = job.apply_async()
result.save()

# save the result ID in your model
your_obj_model = YourModel.objects.get(id='1234')
your_obj_model.task_id = result.id
your_obj_model.save()

それからあなたの見解では

from celery.result import GroupResult
# ...
task_result = GroupResult.restore(your_obj_model.task_id)
task_finished = task_result.ready()
# will be True or False
于 2014-06-25T23:39:23.560 に答える