from flask import jsonify
from flask_cors import CORS
from flask import Flask, request
from celery import Celery
from my_utils import create_p1_api, celery_test_api, get_finished
app = Flask(__name__)
CORS(app, supports_credentials=True)
# 配置消息代理的路径,如果是在远程服务器上,则配置远程服务器中redis的URL
password = quote("xxxxxxx") # redis 数据库密码xxxxxx
celery_broker = f'redis://:{password}@127.0.0.1:6379/0' # 任务数据库
celery_backend = f'redis://:{password}@127.0.0.1:6379/1' # 实时进度数据库
# 初始化Celery
celery = Celery(app.name, broker=celery_broker, backend=celery_backend)
# 启用任务状态跟踪
celery.conf.update(
task_track_started=True, # 记录任务开始状态
result_extended=True, # 存储更多结果元数据
result_expires=24*3600 # 结果保存24小时
)
@celery.task(bind=True) # bind=True 可访问任务上下文
def background_task(self, p_id, saved_files):
"""耗时任务示例"""
if p_id == 1:
create_p1_api(self, saved_files)
else:
celery_test_api(self, saved_files)
return
# 异步任务调度接口,测试生成文件
@app.route("/CreateFile", methods=['POST'], strict_slashes=False)
def create_files_api():
if request.method == "POST":
json_data = request.form
p_id= json_data.get("pid", 1)
try:
# 异步调用 Celery 任务
async_result = background_task.delay(p_id, saved_files)
ret = {"status": 200, "msg": "start success", "task_id": async_result.task_id}
except Exception as e:
ret = {"status": 400, "msg": str(e)}
return jsonify(ret)
# 实时查询异步任务进度
@app.route("/getFinished/", methods=['GET'], strict_slashes=False)
def get_finished_api():
if request.method == "GET":
task_id = request.args.get('task_id')
progress = get_finished(task_id, celery)
ret = {"status": 200, "msg": "请求完成", "progress": progress}
else:
ret = {"status": 500, "msg": "不是GET请求"}
return jsonify(ret)
if __name__ == '__main__':
app.run(host='0.0.0.0', port=8000, debug=True)
以上是 main.py 内容
import time
from celery.result import AsyncResult
# 查询进度函数
def get_finished(task_id, celery_app):
result = AsyncResult(task_id, app=celery_app)
if result.ready():
# 已完成
progress = 100
else:
# 实时查询进度
progress = result.result.get("current", 0)
return progress
# 耗时异步执行的任务
def create_p1_api(self, saved_files):
with open(saved_files, "r") as f:
for i in range(10):
time.sleep(5)
self.update_state(state='PROGRESS', meta={'current': i*10})
# 测试
def celery_test_api(self, saved_files):
pass
以上是my_utils.py 内容