我是芹菜的新手并开始了解它的工作原理。但是我在理解如何从类方法中更新状态时遇到了一些麻烦。
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})
test.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 有关,但我不知道如何解决这个问题。
也许有更好的方法从我的方法内部获得更新?
答案 0 :(得分:5)
当您致电self.update_state()
时,您使用的self
是您班级Test
的{{1}}。你需要在你的任务的入口点给你的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)