我有一个Flask应用程序,我可以开始芹菜任务。这个任务是一种守护进程,我只想启动一次。因此,当它启动时,我想要的就是监视它的状态,在任务中显示一些消息等等。这一切都运行良好。
我无法想象如何做到这一点,在烧瓶应用程序中,我是如何在启动后获得任务ID的。当我开始我可以做的任务时
@main.route('/start', methods=['POST'])
def start():
task = long_task.apply_async()
# from here I know the id with 'task.id'
return jsonify({}), 202
所以我有任务的ID。
现在,想象一下我重新启动芹菜服务器或者我杀了任务,如何检查这样的任务是否正在运行?如果它正在运行,我该如何检索其ID?
我现在尝试了:运行芹菜服务器,运行烧瓶应用程序,从烧瓶应用程序中启动芹菜任务,重新加载主页以查看我是否可以检索任务ID:
@main.route('/', methods=['GET', 'POST'])
def index():
"""Renders the home page."""
_t = celery.current_task
if _t is not None:
t_id = toto.request.id
return render_template('main/index.html', title='Main page')
但即使芹菜任务正在运行,_t
变量始终为None
。
答案 0 :(得分:0)
一种方法(通过celery API)将检查control client。它可以帮助您检查reserved
任务,active
任务等等。
i = app.control.inspect()
i.reserved()
#output:
[{'worker1.example.com':
[{'name': 'tasks. long_task',
'id': '32666e9b-809c-41fa-8e93-5ae0c80afbbf',
'args': '(8,)',
'kwargs': '{}'}]}]
您可以遍历此任务数组以查找(按任务名称)您的任务是否已在运行并检索其状态。
了解更多信息:http://docs.celeryproject.org/en/latest/userguide/workers.html#dump-of-reserved-tasks
第二个选项(我认为这是一个坏主意)可能是直接检查backend
:如果此Redis仅用作芹菜后端并且您只运行此任务 - 您可以找到所有键(uuid)是密钥的一部分,任务状态将是值的一部分。