仿真任务调度 API
simulation_bp 是前后端性能优化的关键。由于 CPD 模型模拟涉及复杂的常微分方程求解,该接口通过 Celery 异步队列 将请求与计算解耦,确保 Web 服务在高并发下的响应速度。
🏎️ 异步处理流架构
Section titled “🏎️ 异步处理流架构”为了提供极致的用户体验,接口设计遵循了“提交即响应,过程可追踪”的原则。
1. 模拟启动接口
Section titled “1. 模拟启动接口”支持两种模型算法:SIM (标准版) 与 SIM2 (增强/回填版)。
- URL:
/simulate或/simulate2 - Method:
POST - Auth:
@jwt_required() - HTTP Status:
202 Accepted(表示请求已接受并入队)
- 参数预处理:调用
preprocess_params统一物理量单位与类型。 - 非阻塞设计:使用
.delay()立即释放请求连接,不等待计算结果。 - JSON 加速:使用
orjson替代原生json库,提升 5-10 倍的序列化速度。
2. 状态检查接口
Section titled “2. 状态检查接口”客户端根据提交时返回的 task_id 定时调取此接口。
- URL:
/task_status/<task_id> - Method:
GET
状态机逻辑 (State Machine)
Section titled “状态机逻辑 (State Machine)”| 任务状态 | 响应状态码 | 业务逻辑说明 |
|---|---|---|
PENDING/STARTED | 200 | 返回 processing 状态,前端展示进度动画。 |
SUCCESS | 200 | 双阶段读取:从 Celery 拿元数据,从 DB 拿大矩阵。 |
FAILURE | 500 | 捕获物理模型崩溃异常,回传 traceback 或错误描述。 |
💾 大数据量读取策略
Section titled “💾 大数据量读取策略”在任务完成后,系统并没有将数万行的计算结果直接塞进 Celery 的结果后端(防止 Redis 内存暴涨),而是采用了 侧路加载(Side-Loading) 策略:
- Worker 端:计算完成后,将大数据存入关系型数据库的
CalcResult表。 - API 端:在
SUCCESS状态下,仅通过 Celery 获取record_id,再执行高效的 SQL 查询获取完整矩阵。 - 动态回填:对于
SIM2模型,会额外提取data_front字典,用于前端输入框的数值自动校准。
💻 关键代码实现
Section titled “💻 关键代码实现”1. 异步结果组装 (Status 200)
Section titled “1. 异步结果组装 (Status 200)”# 核心逻辑:从数据库调取大数据,而不是直接从 Celery 任务对象取result_entry = CalcResult.query.filter_by(record_id=record_id).first()
response_body = { "status": "completed", "result": { "headers": result_entry.headers, # 表头信息 "results": result_entry.data_rows # 数万行的计算矩阵 }}