Skip to content

异步计算任务定义

simulation_tasks.py 是系统的计算核心。它运行在独立的 Worker 进程中,负责处理高负载的 CPU 任务。它在模型引擎(Engine)与数据库(SQLAlchemy)之间扮演了“数据清洗与搬运工”的角色。


异步任务的设计考虑了大规模科学计算中的常见问题:数据类型不匹配、内存占用过高以及长连接超时。

自动重试 (Retry)

autoretry_for 监控计算过程。若因瞬时资源不足崩溃,任务将以退避算法(backoff)重试 3 次。

超时硬限制

time_limit=180。防止因 ODE 求解器发散导致的计算无限死循环,强制终止 3 分钟未响应的任务。

上下文隔离

使用 with flask_app.app_context(),在独立进程中模拟 Flask 运行环境,以便正常使用 SQLAlchemy。


任务从进入队列到结果落地的生命周期如下:

如果任务标签为 CPD_SIM2,Worker 会执行特殊的自适应逻辑

  • 提取引擎输出的 data_front 字典。
  • 同步更新快照:将优化后的参数写回 input_params,确保数据库中记录的是“经过调优后的真实参数”。
  • UI 消息定制:向前端发送特定提示,告知用户参数已自动回填。

任务完成后,会同时操作两个表:

  • 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/commit
except Exception as db_err:
# 关键:一旦数据库写入失败,执行回滚并抛出异常触发 Celery 重试
db.session.rollback()
raise db_err

监控项正常范围异常处理
任务耗时5s - 60s若频繁接近 180s 限制,需检查求解器步长 dt0
内存占用200MB - 1GB检查 optimized_results 的降采样倍率
重试频率< 1%若重试频繁,通常是由于输入参数导致物理模型崩溃