2016-06-28 62 views
1

好吧,我想我有一个相对简单的问题,就像我用它打砖墙。我有一个应用程序和一个网页,允许您使用celery & redis(broker)在服务器端运行多个脚本。查询任务状态 - 芹菜和redis

所有我想要做的是,当我开始一个任务给它一个名称/ ID(任务将被描绘成在客户端上的按钮),即

@app.route('/start_upgrade/<task_name>') 
def start_upgrade(task_name): 
    example_task.delay(1, 2, task_name=task_name) 

那么任务已经启动后,关闭我想看看任务是否正在运行/等待/完成一个单独的请求,最好是像;

@app.route('/check_upgrade_status/<task_name>') 
def get_task_status(task_name): 
    task = celery.get_task_by_name(task_name) 
    task_state = task.state 
    return task_state # pseudocode 

但我在文档中找不到像这样的东西。尽管仅供参考,但我对芹菜很新,所以假设我一无所知。另外,为了更加明显,我需要能够从python查询任务状态,请不要使用CLI命令。

任何实现我查询队列目标的替代方法也是受欢迎的。

回答

0

当您使用delayapply_async启动任务时,会创建一个对象AsyncResult并包含该任务的ID。为了得到它,你只需要将它存储在一个变量中。

例如

@app.route('/start_upgrade/<task_name>') 
def start_upgrade(task_name): 
    res = example_task.delay(1, 2, task_name=task_name) 
    print res.id 

你可以存储这个ID,也许它与其他数据库中的东西联系起来(或只是打印它就像我的例子一样)。

然后你可以检查与蟒蛇控制台的任务的状态:

from celery.result import AsyncResult 
AsyncResult(your_task_id).status 

看看结果文件,你应该得到你所需要的有:http://docs.celeryproject.org/en/latest/reference/celery.result.html

0

我最终搞清楚从阿瑟尔的职位上解决我的问题。

与Redis的结合,我创建这些功能

import redis 
from celery.result import AsyncResult 

redis_cache = redis.StrictRedis(host='localhost', port=6379, db=0) 

def check_task_status(task_name): 
    task_id = redis_cache.get(task_name) 
    return AsyncResult(task_id).status 

def start_task(task, task_name, *args, **kwargs): 
    response = task.delay(*args, **kwargs) 
    redis_cache.set(task_name, response.id) 

,让我具体名称定​​义要任务。注意我还没有真正测试过这个,但它是有道理的。

示例用法;

start_task(example_task, "example_name", 1, 2)