代码之家  ›  专栏  ›  技术社区  ›  dev

Python芹菜获取任务状态

  •  0
  • dev  · 技术社区  · 4 年前

    有这个代码和设置芹菜RabbitMQ

    创建和执行任务。我得到任务uuid,但不知何故无法检查任务状态

    from flask_oidc import OpenIDConnect
    from flask import Flask, json, g, request
    from flask_cors import CORS
    from celery import Celery
    import os
    import time
    
    
    app = Flask(__name__)
    app.config.update({
      'OIDC_CLIENT_SECRETS': './client_secrets.json',
      'OIDC_RESOURCE_SERVER_ONLY': True,
      'CELERY_BROKER_URL': 'amqp://rabbitmq:rabbitmq@rabbit:5672/',
      'CELERY_RESULT_BACKEND': 'rpc://'
    })
    oidc = OpenIDConnect(app)
    CORS(app)
    
    client = Celery(app.name, broker=app.config['CELERY_BROKER_URL'])
    client.conf.update(app.config)
    
    
    
    @client.task()
    def removeUser(id):
      time.sleep(10);
    
    
    @app.route("/removeUser", methods=['GET'])
    def removeUserID():
      id = request.args.get('id')
      result = removeUser.apply_async(args=[id], countdown=60)
      return result.id
      
    
    @app.route("/checkStatus", methods=['GET'])
    def checkStatus():
      uuid = request.args.get('uuid') 
      res = removeUser.AsyncResult(uuid)
      print(uuid)
      if(res=="SUCCESS"):
        return "success"
      else:
        return "progress"
    
    def json_response(payload, status=200):
      return (json.dumps(payload), status, {'content-type': 'application/json'})
    

    资源=removeUser.AsyncResult删除(uuid)似乎未获取任务状态。如何正确获取?

    0 回复  |  直到 4 年前
        1
  •  1
  •   ItayB    4 年前

    AsyncResult 是一个对象 state property 是你想要的:

    @app.route("/checkStatus", methods=['GET'])
    def checkStatus():
      uuid = request.args.get('uuid') 
      res = removeUser.AsyncResult(uuid)
      print(uuid)
      if res.state == "SUCCESS":
        return "success"
      else:
        return "progress"
    

    笔记:

    1. 任务也可能失败,因此有更好的方法检查任务是否已执行(而不是与“成功”比较)。
    2. 如果您要添加芹菜应用程序,则不必使用特定的任务,此函数可以帮助您通过uuid获取任何芹菜任务的状态。
    @app.route("/checkStatus", methods=['GET'])
    def checkStatus():
      uuid = request.args.get('uuid') 
      res = AsyncResult(uuid, app=client)
      print(uuid)
      if res.ready():
        return "success"
      else:
        return "progress"