我是 celery 的新手,开始了解它是如何工作的。但是,我在理解如何从类方法内部更新状态时遇到了一些麻烦。
views.py
@app.route('/',methods=['POST'])
def foo_bar():
task = foo_async.apply_async()
return json.dumps({}),202
background_task.py
@celery.task(bind=True)
def foo_async(self):
t = Test()
t.run()
return json.dumps({'progress':100})
测试.py
class Test(Task):
def __init__(self):
self.foo = 'bar'
def run(self):
for i in range(0,10):
print 'Current : ',i
self.update_state(state='PROGRESS',meta={'current':i})
time.sleep(4)
但是我在发出请求后得到了这个错误:
[...] return task_id.replace('-','')
AttributeError: 'NoneType' object has no attribute 'replace'
所以我发现问题出在 id 上,但我不知道如何解决。
也许有更好的方法从我的方法内部获取更新?
请您参考如下方法:
当您调用 self.update_state() 时,您正在使用的 self 就是您的类 Test。您需要在任务入口点提供给您的 self 上执行此操作,函数 foo_async 的参数。
您将 Test 类定义为 Task 的子类有什么原因吗?您已经有一个由 celery.task 装饰器创建的任务。
尝试以下操作:
@celery.task(bind=True)
def foo_async(self):
t = Test(self)
t.run()
return json.dumps({'progress':100})
class Test(object):
def __init__(self, task):
self.task = task
self.foo = 'bar'
def run(self):
for i in range(0,10):
print 'Current : ',i
self.task.update_state(state='PROGRESS',meta={'current':i})
time.sleep(4)
