查询任务状态 - 芹菜& redis的

时间:2016-06-28 09:18:13

标签: python redis celery celery-task

好吧我认为我有一个相对简单的问题,就像我用它撞墙一样。我有一个烧瓶应用程序和一个网页,允许您使用芹菜和放大器在服务器端运行许多脚本。 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命令。

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

2 个答案:

答案 0 :(得分:1)

当您使用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,也可以将其与数据库中的其他内容相关联(或者像我在示例中所做的那样打印它)。

然后,您可以使用以下命令在python控制台中检查任务的状态:

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

查看结果文档,您应该获得所需内容:http://docs.celeryproject.org/en/latest/reference/celery.result.html

答案 1 :(得分: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)