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