2016-06-28 7 views
1

だから、私は比較的単純な問題があると思うので、それを使ってレンガの壁を打っているようです。私はフラスコのアプリケーションと、セロリ& redis(ブローカー)を使用してサーバー側で多数のスクリプトを実行できるWebページを持っています。クエリタスクの状態 - Celery&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 

しかし、私はドキュメントにそのようなものは見つかりません。私はセロリーにはとても新しいので、ちょうどFYIだから私は何も知らないと思う。また、余分なことを明らかにするために、私はPythonからタスクの状態を照会できるようにする必要があります。CLIコマンドは不要です。

キューを照会する私の目標を達成する他の方法も歓迎します。

答えて

0

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

0

私が把握終わりましたアーサーのポストから私の質問のための解決策を出してください。私は私がタスクに固有の名前を定義することができます

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) 

これらの関数を作成したのRedisと併せて

。私は実際にこれをまだテストしていませんが、意味があります。

使用例;

start_task(example_task, "example_name", 1, 2) 
関連する問題