2017-10-19 186 views
0

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

我试过了现在:运行芹菜服务器,运行的烧瓶中的应用,从whithin烧瓶应用程序启动芹菜任务,重新加载主页,看看我是否可以检索任务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

请注意,这是使用Celery的不好的方法,它不是用来托管一个长时间运行的任务。你在这里问到的正是你的要求。您可能需要['Manager'](https://docs.python.org/3/library/multiprocessing.html#managers)。 – davidism

+0

哪个结果是你使用的后端? – georgexsh

+0

redis用于芹菜后端 – GuillaumeA

回答

0

一种方法(通过芹菜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是键的一部分),任务状态将成为值的一部分。