Состояние задачи и джанго-сельдерей
Я использую django-сельдерей и имею задачу следующим образом:
class TestTask(Task):
name = "enabler.test_task"
def run(self, **kw):
debug_log("begin test task")
time.sleep(5)
debug_log("end test task")
def on_success(self, retval, task_id, args, kwargs):
debug_log("on success")
def on_failure(self, retval, task_id, args, kwargs):
debug_log("on failure")
Я использую оболочку django для запуска задачи:
python manage.py shell
r = tasks.TestTask().delay()
Из журнала сельдерея я вижу, что эта задача выполнена:
[2012-01-16 08:13:29,362: INFO/MainProcess] Got task from broker: enabler.test_task[e2360811-d003-45bc-bbf8-c6fd5692c32c]
[2012-01-16 08:13:29,390: DEBUG/PoolWorker-3] begin test task
[2012-01-16 08:13:34,389: DEBUG/PoolWorker-3] end test task
[2012-01-16 08:13:34,390: DEBUG/PoolWorker-3] on success
[2012-01-16 08:13:34,390: INFO/MainProcess] Task enabler.test_task[e2360811-d003-45bc-bbf8-c6fd5692c32c] succeeded in 5.00004410744s: None
Однако, когда я проверяю состояние задачи из ада, я всегда получал PENDING:
>>> r = tasks.TestTask().delay()
>>> r
<AsyncResult: e2360811-d003-45bc-bbf8-c6fd5692c32c>
>>> r.state
'PENDING'
>>> r.state
'PENDING'
>>> r.state
'PENDING'
>>> r.state
'PENDING'
хотя задача выполнена хорошо.
Почему это происходит?
Ответы
Ответ 1
Какую версию сельдерея вы используете? Я замечаю, что я очень опаздываю на эту вечеринку, но на случай, если это поможет кому-то в будущем. Если для задачи задано значение ignore_result (которое по умолчанию используется в последней версии), оно останется в PENDING и не перейдет к SUCCESS.
Их документация здесь,
@celery.task(ignore_result=True)
def mytask(...)
something()
Вы можете просмотреть его самостоятельно здесь, если у вас есть другие вопросы, дайте мне знать.
** Также обратите внимание, что даже если у вас есть ignore_result, установленный в true, вы всегда можете вручную обновить состояние, например,
from celery import current_task
current_task.update_state(state='PROGRESS', meta={'description': 'Doing some task', 'current': 59, 'tota': 73})
Что-то в этом роде для индикаторов прогресса также найдено на странице документации сельдерея.