【问题标题】:Task state and django-celery任务状态和 django-celery
【发布时间】:2012-02-11 05:00:09
【问题描述】:

我使用 django-celery 并且有这样的任务:

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 shell 来运行任务:

python manage.py shell

r = tasks.TestTask().delay()

从 celery 日志中我看到该任务已执行:

[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'

即使任务执行得很好。

为什么会这样?

【问题讨论】:

    标签: python celery django-celery


    【解决方案1】:

    你用的是什么版本的芹菜?我注意到我参加这个聚会真的很晚了,但以防万一这对将来的某人有所帮助。如果任务设置为 ignore_result(在最新版本中默认设置),它将停留在 PENDING 并且不会转到 SUCCESS。

    他们的文档在这里,

    @celery.task(ignore_result=True)
    def mytask(...)
        something()
    

    您可以自己查看here,如果您有任何其他问题,请告诉我。

    ** 另一个注意事项,即使您将 ignore_result 设置为 true,您也可以随时手动更新状态,

    from celery import current_task
    current_task.update_state(state='PROGRESS', meta={'description': 'Doing some task', 'current': 59, 'tota': 73})
    

    进度条的这种性质——也可以在 celery 的文档页面上找到。

    【讨论】: