【问题标题】:How to know if a celery task has already been launched如何知道芹菜任务是否已经启动
【发布时间】:2017-10-19 20:44:18
【问题描述】:

我有一个可以启动 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。

现在,假设我重新启动了 celery 服务器或者我终止了任务,我如何检查这样的任务是否正在运行?如果它正在运行,我如何检索它的 id ?

我现在尝试的是:运行一个 celery 服务器,运行一个烧瓶应用程序,从烧瓶应用程序中启动一个 celery 任务,重新加载主页以查看我是否可以检索任务 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,即使在 celery 任务正在运行时也是如此。

【问题讨论】:

  • 您使用的是哪个结果后端?
  • 芹菜后端的redis

标签: python flask celery


【解决方案1】:

一种方法(通过 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 仅用作 celery 后端并且您仅运行此任务 - 您可以找到所有密钥(uuid 是一部分键),任务状态将成为值的一部分。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-12
    • 1970-01-01
    • 2016-08-18
    • 1970-01-01
    • 1970-01-01
    • 2019-12-11
    • 2010-09-16
    • 1970-01-01
    相关资源
    最近更新 更多