Flask 烧瓶芹菜从另一个函数内部更新_状态

Flask 烧瓶芹菜从另一个函数内部更新_状态,flask,celery,celery-task,Flask,Celery,Celery Task,我想从另一个函数更新芹菜任务的状态。以下是我现在拥有的: 路线 芹菜任务-在后台启动一些_python_script.handle 一些_python_script.handle: 理想情况下,我希望能够self.update_状态芹菜任务,以便我可以轻松地从我的应用程序请求其状态,如下所示: 一些_python_script.handle(理想情况下): 检查进度(理想情况下): @app.route(“/status/”) def任务状态(任务id): task=函数外部。AsyncResu

我想从另一个函数更新芹菜任务的状态。以下是我现在拥有的:

路线 芹菜任务-在后台启动一些_python_script.handle 一些_python_script.handle: 理想情况下,我希望能够self.update_状态芹菜任务,以便我可以轻松地从我的应用程序请求其状态,如下所示:

一些_python_script.handle(理想情况下): 检查进度(理想情况下):
@app.route(“/status/”)
def任务状态(任务id):
task=函数外部。AsyncResult(任务id)
答复={
“状态”:task.state,
“id”:task.id,
“状态”:task.status,
}
返回jsonify(响应)

或者类似的东西。非常感谢您的帮助,我对芹菜很陌生

您应该声明用于调用的任务id。 你可以查一下

下面的代码应该可以工作

# 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'})

如果将
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'})

它无法工作,因为在
handle
的范围内没有
self
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)
# 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'})
@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'})