我试图让任务状态如下:
__ 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
任务。有什么问题?
答案 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