python + celery 异步任务接口服务,实时返回任务进度

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 内容

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值