自动重试 (Retry)
autoretry_for 监控计算过程。若因瞬时资源不足崩溃,任务将以退避算法(backoff)重试 3 次。
simulation_tasks.py 是系统的计算核心。它运行在独立的 Worker 进程中,负责处理高负载的 CPU 任务。它在模型引擎(Engine)与数据库(SQLAlchemy)之间扮演了“数据清洗与搬运工”的角色。
异步任务的设计考虑了大规模科学计算中的常见问题:数据类型不匹配、内存占用过高以及长连接超时。
自动重试 (Retry)
autoretry_for 监控计算过程。若因瞬时资源不足崩溃,任务将以退避算法(backoff)重试 3 次。
超时硬限制
time_limit=180。防止因 ODE 求解器发散导致的计算无限死循环,强制终止 3 分钟未响应的任务。
上下文隔离
使用 with flask_app.app_context(),在独立进程中模拟 Flask 运行环境,以便正常使用 SQLAlchemy。
计算引擎需要高性能的 numpy.array,而网络传输和数据库存储需要纯 list。
table_data 恢复为 np.array,以适配底层线性代数库。optimize_calculation_data 降采样,并使用 .tolist() 将矩阵还原为 JSON 可序列化格式。任务从进入队列到结果落地的生命周期如下:
如果任务标签为 CPD_SIM2,Worker 会执行特殊的自适应逻辑:
data_front 字典。input_params,确保数据库中记录的是“经过调优后的真实参数”。任务完成后,会同时操作两个表:
CalcRecord: 存储元数据(谁、什么时候、用了什么参数)。使用 db.session.flush() 获取生成的自增 ID。CalcResult: 存储巨量计算矩阵。通过外键 record_id 关联。# 核心逻辑:Worker 内部转换if working_params.get('use_table'): # 仅在计算前转为 Numpy,不影响持久化层,因为 DB 不支持 Numpy 类型 working_params['table_data'] = np.array(working_params['table_data'], dtype=float)try: # ... 执行 add/commitexcept Exception as db_err: # 关键:一旦数据库写入失败,执行回滚并抛出异常触发 Celery 重试 db.session.rollback() raise db_err| 监控项 | 正常范围 | 异常处理 |
|---|---|---|
| 任务耗时 | 5s - 60s | 若频繁接近 180s 限制,需检查求解器步长 dt0 |
| 内存占用 | 200MB - 1GB | 检查 optimized_results 的降采样倍率 |
| 重试频率 | < 1% | 若重试频繁,通常是由于输入参数导致物理模型崩溃 |