任务_method的Celery AsyncResult

时间:2015-04-18 13:35:41

标签: python rabbitmq celery

我试图让任务状态如下:

__ init __。py

celery = Celery(app.name,backend='amqp',broker=app.config['CELERY_BROKER_URL'])
celery.conf.update(app.config)

foo.py

class Foo(object):  
    def bar(self):
        task = self._bar_async.apply_async()
        return task.id
    @celery.task(filter=task_method,bind=True)
    def _bar_async(task,self):
        for i in range(0,100):
            task.update_state(state='PROGRESS',meta={'progress':i})
            time.sleep(2)

taskstatus.py

def taskstatus(task_id):
    task = celery.AsyncResult(id=task_id)

是否建议将update_state与 bind 一起使用?
此外,当我尝试使用taskstatus获取任务状态时,我总是得到NoneType 任务。有什么问题?

1 个答案:

答案 0 :(得分:2)

您的代码中存在两个问题

首先,将参数 self 添加到 apply_async 方法

def bar(self):
        task = self._bar_async.apply_async([self])

此更改将修复 get NoneType for task 问题。原因是工作中的任务将失败,因此您无法获得结果。

其次,应该在taskstatus()中使用 app.backend.get_result 来查看进度而不是AsyncResult,因为AsyncResult.get()将阻塞,直到任务状态变为 ready

from apps import celery
app = celery.app

r = app.backend.get_result(task_id)
print r