Flask Celery update_state来自另一个函数

时间:2016-10-26 10:26:20

标签: flask celery celery-task

我想从另一个函数更新我的Celery任务的状态。这就是我现在所拥有的:

路线

@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

Celery Task - 在后台启动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

理想情况下,我希望能够自我更新芹菜任务,以便我可以轻松地从我的应用程序请求其状态,如下所示:

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)

或类似的东西。非常感谢任何帮助,我对Celery来说很新!

2 个答案:

答案 0 :(得分: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'})

答案 1 :(得分:0)

如果将bind=True添加到主要芹菜任务,则可以使用self关键字访问芹菜任务对象。使用self将任务对象传递到下一个函数。

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

另一个函数可以接受此任务对象并对其进行更新:

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