2016-10-26 3 views
3

Я хотел бы обновить состояние моей задачи Celery от другой функции. Вот что у меня сейчас:Колба сельдерея update_state изнутри другая функция

Маршрут

@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 

В идеале, я 'd хотел бы иметь возможность 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

Вы должны объявить идентификатор задачи для вызова. Вы можете проверить 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'})