任务状态和django-芹菜

lst*_*kov 10 python celery django-celery

我使用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")
Run Code Online (Sandbox Code Playgroud)

我使用django shell来运行任务:

python manage.py shell

r = tasks.TestTask().delay()
Run Code Online (Sandbox Code Playgroud)

从芹菜日志我看到任务执行:

[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
Run Code Online (Sandbox Code Playgroud)

然而,当我从地狱检查任务状态时,我总是得到PENDING:

>>> r = tasks.TestTask().delay()
>>> r
<AsyncResult: e2360811-d003-45bc-bbf8-c6fd5692c32c>
>>> r.state
'PENDING'
>>> r.state
'PENDING'
>>> r.state
'PENDING'
>>> r.state
'PENDING'
Run Code Online (Sandbox Code Playgroud)

即使任务执行得很好.

为什么会这样?

Sky*_*ude 10

你用的是什么版本的芹菜?我注意到我参加这个派对的时间已经很晚了,但是如果这对未来的某个人有帮助的话.如果任务设置为ignore_result(默认情况下是最新版本),它将保持PENDING而不是SUCCESS.

他们的文件在这里

@celery.task(ignore_result=True)
def mytask(...)
    something()
Run Code Online (Sandbox Code Playgroud)

您可以在这里自己查看,如果您有任何其他问题,请告诉我.

**还有另一个注意事项,即使你将ignore_result设置为true,也可以像这样手动更新状态,

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

进步栏的那种性质 - 也可以在celery的文档页面上找到.