如何知道芹菜任务是否已经启动

时间:2017-10-19 20:44:18

标签: python flask celery

我有一个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

1 个答案:

答案 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)是密钥的一部分,任务状态将是值的一部分。