如何从芹菜后端存储中检索元数据
How to retrieve meta from celery backend storage
我正在使用带有烧瓶应用程序的芹菜来启动一些后台任务,我正在使用 mongoDB 作为后端。
我想在后端存储一些关于正在启动的任务的信息,然后能够检索它。
我认为关键在于使用 self.update_state(state= ..., meta = {})
,其中 meta 是我的自定义信息。但是我没有发现任何工作。
我们假设您有这样的任务:
@celery.task(bind=True)
def counter(self):
for i in xrange(100):
time.sleep(1)
self.update(state='PROGRESS', meta={'current': i})
return {'status': 'complete'}
你有这样的烧瓶路线:
@app.route('/count/')
def count_100():
"""
this starts a counter task and returns a response immediately
"""
task = counter.delay()
# this will return an empty json object with 202 http code status
# which means requests is still in progress and a Location header
return jsonify(), 202, dict(Location=url_for('status', task_id=task.id))
最后你的任务状态路由是这样的:
from celery.result import AsyncResult
...
@app.route('/status/<task_id>/')
def status(task_id):
task = AsyncResult(task_id) # retrieving the task we started
if task.state == 'PROGRESS':
response = {
'state': task.state,
'current': task.info.get('current', 0)
}
return jsonify(response)
我正在使用带有烧瓶应用程序的芹菜来启动一些后台任务,我正在使用 mongoDB 作为后端。
我想在后端存储一些关于正在启动的任务的信息,然后能够检索它。
我认为关键在于使用 self.update_state(state= ..., meta = {})
,其中 meta 是我的自定义信息。但是我没有发现任何工作。
我们假设您有这样的任务:
@celery.task(bind=True)
def counter(self):
for i in xrange(100):
time.sleep(1)
self.update(state='PROGRESS', meta={'current': i})
return {'status': 'complete'}
你有这样的烧瓶路线:
@app.route('/count/')
def count_100():
"""
this starts a counter task and returns a response immediately
"""
task = counter.delay()
# this will return an empty json object with 202 http code status
# which means requests is still in progress and a Location header
return jsonify(), 202, dict(Location=url_for('status', task_id=task.id))
最后你的任务状态路由是这样的:
from celery.result import AsyncResult
...
@app.route('/status/<task_id>/')
def status(task_id):
task = AsyncResult(task_id) # retrieving the task we started
if task.state == 'PROGRESS':
response = {
'state': task.state,
'current': task.info.get('current', 0)
}
return jsonify(response)