2016-10-26 6 views
3

セロリタスクの状態を別の関数から更新したいと思います。ここで私は今持っているものです。Flask Celery update_state from another function

ルート

@app.route('/my-long-function', methods=['POST']) 
def my_long_function(): 

    param1 = request.form['param1'] 
    param2 = request.form['param2'] 

    task = outside_function.delay(param1, param2) 

    return task.id 

セロリタスクを - バックグラウンドで起動しsome_python_script.handle

@celery.task(name='outside_function') 
def outside_function(param1, param2): 
    with app.app_context(): 
     some_python_script.handle(param1, param2) 

some_python_script.handle:理想的には

def handle(param1, param2): 
    param1 + param2 
    # many, many different things 

、Iセロリのタスクをself.update_stateできるようにして、自分のアプリからそのステータスを簡単にリクエストできるようにしたい、そのような:

some_python_script.handle(理想的には):

def handle(param1, param2): 
    param1 + param2 
    # many, many different things 
    self.outside_function.update_state('PROGRESS', meta = {'status':'progressing'}) 

チェック進捗(理想的には):

@app.route('/status/<task_id>') 
def taskstatus(task_id): 
    task = outside_function.AsyncResult(task_id) 
    response = { 
    'state': task.state, 
    'id': task.id, 
    'status' : task.status, 
    } 

    return jsonify(response) 

か何か似ています。助けていただければ幸いです。私はセロリーにはとても新しいです!

答えて

0

呼び出しのためのタスクIDを宣言する必要があります。 update_stateを確認できます。

以下のコードが有効です。

# capture id of celery task 
ID = self.request.id 

def handle(param1, param2): 
    param1 + param2 
    # many, many different things 
    # update the state of celery task with direct reference to it 
    self.update_state(task_id=ID, state='PROGRESS', meta = {'status':'progressing'})