Ore*_*lus 1 python celery flask
我是芹菜的新手,并开始了解它是如何工作的。但是我在理解如何从类方法内部更新状态时遇到了一些麻烦。
views.py
@app.route('/',methods=['POST'])
def foo_bar():
task = foo_async.apply_async()
return json.dumps({}),202
Run Code Online (Sandbox Code Playgroud)
background_task.py
@celery.task(bind=True)
def foo_async(self):
t = Test()
t.run()
return json.dumps({'progress':100})
Run Code Online (Sandbox Code Playgroud)
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)
Run Code Online (Sandbox Code Playgroud)
但是我发出请求后收到此错误:
[...] return task_id.replace('-','')
AttributeError: 'NoneType' object has no attribute 'replace'
Run Code Online (Sandbox Code Playgroud)
因此,我看到问题出在关于ID的问题,但我不知道如何解决。
也许有更好的方法从我的方法中获取更新?
当您呼叫时,您正在使用的是您班上self.update_state()的self那个Test。您需要self在任务的入口点(即function的参数)上给定的上执行该操作foo_async。
有什么理由将class定义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)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3280 次 |
| 最近记录: |