Проверьте, обрабатывается ли задача сельдерея - PullRequest
11 голосов
/ 02 декабря 2010

Как я могу проверить, обрабатывается ли задание (task_id) в сельдерее ? У меня есть следующий сценарий:

  1. Запустить задачу в представлении Django
  2. Сохранить BaseAsyncResult в сеансе
  3. Выключите демона сельдерея (тяжело), ​​чтобы задача больше не выполнялась
  4. Проверьте, является ли задача «мертвой»

Есть идеи? Может ли поиск выполнить всю задачу, выполняемую сельдереем, и проверить, есть ли еще моя?

Ответы [ 2 ]

3 голосов
/ 31 января 2011

определить поле (PickledObjectField) в вашей модели для хранения задачи сельдерея:

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

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

Если ваша задача не является специфической для какой-либо модели, вы должны создать ее специально для задач с сельдереем.

или я предлагаю использовать джанго-сельдерей. Имеет хорошую функцию мониторинга:
http://ask.github.com/celery/userguide/monitoring.html#django-admin-monitor, сохраняет детали задач в модели django в хорошем графическом виде.

0 голосов
/ 26 июня 2014

Я думаю, что есть лучший способ, чем сохранить объект задачи в модели. Например, если вы хотите проверить, завершена ли группа задач (параллельная):

# 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
...