2016-06-28 132 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)