任务状态与django-celery

11 投票
1 回答
5266 浏览
提问于 2025-04-17 10:20

我在使用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的命令行来运行这个任务:

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'

尽管任务实际上已经成功执行了。

这是为什么呢?

1 个回答

12

你在用哪个版本的celery?我知道我来得有点晚,但希望这能对将来某些人有帮助。如果任务设置为忽略结果(在最新版本中默认就是这样),那么它的状态会一直显示为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})

关于进度条的内容——也可以在celery的文档页面找到。

撰写回答