实现多进程 epanet 模拟,不保留临时文件

This commit is contained in:
2026-03-18 16:56:44 +08:00
parent c5d3075ae2
commit 7c44654195
6 changed files with 114 additions and 127 deletions
+13 -36
View File
@@ -27,15 +27,12 @@ import json
import pytz
import requests
import time
import shutil
from app.infra.epanet.epanet import Output
from typing import Optional, Tuple
import app.infra.db.influxdb.api as influxdb_api
import typing
import psycopg
import logging
import app.services.globals as globals
import uuid
import app.services.project_info as project_info
from app.core.config import get_pgconn_string
from app.infra.db.timescaledb.internal_queries import (
@@ -1219,7 +1216,7 @@ def run_simulation(
cs.append(valve_status)
set_status(name_c, cs)
# 运行并返回结果
run_project(name_c)
result_data = json.loads(run_project(name_c))
time_cost_end = time.perf_counter()
print(
"{} -- Hydraulic simulation finished, cost time: {:.2f} s.".format(
@@ -1227,23 +1224,22 @@ def run_simulation(
time_cost_end - time_cost_start,
)
)
# DingZQ 下面这几句一定要这样,不然读取不了
# time.sleep(5) # wait 5 seconds
# TODO: 2025/03/24
# DingZQ 这个名字要用随机数来处理
tmp_file = f"./temp/simulation_{uuid.uuid4()}.result.out"
shutil.copy(f"./temp/{name_c}.db.opt", tmp_file)
output = Output(tmp_file)
node_result = output.node_results()
link_result = output.link_results()
output_data = result_data.get("output")
if not isinstance(output_data, dict):
raise RuntimeError("run_project did not return JSON output content")
node_result = output_data.get("node_results")
link_result = output_data.get("link_results")
if node_result is None or link_result is None:
raise RuntimeError("run_project output missing node_results or link_results")
# link_flow = []
# for link in link_result:
# link_flow.append(link['result'][-1]['flow'])
# print(link_flow)
num_periods_result = output.times()["num_periods"]
times_info = output_data.get("times") or {}
num_periods_result = times_info.get("num_periods")
if num_periods_result is None:
raise RuntimeError("run_project output missing times.num_periods")
print("simulation_type", simulation_type)
print("before store result")
# print(num_periods_result)
@@ -1274,27 +1270,8 @@ def run_simulation(
# 暂不需要再次存储 SCADA 模拟信息
# TimescaleInternalQueries.fill_scheme_simulation_result_to_SCADA(scheme_type=scheme_type, scheme_name=scheme_name)
# if simulation_type.upper() == "REALTIME":
# influxdb_api.store_realtime_simulation_result_to_influxdb(
# node_result, link_result, modify_pattern_start_time
# )
# elif simulation_type.upper() == "EXTENDED":
# influxdb_api.store_scheme_simulation_result_to_influxdb(
# node_result,
# link_result,
# modify_pattern_start_time,
# num_periods_result,
# scheme_type,
# scheme_name,
# )
# 暂不需要再次存储 SCADA 模拟信息
# influxdb_api.fill_scheme_simulation_result_to_SCADA(scheme_type=scheme_type, scheme_name=scheme_name)
print("after store result")
del output
os.remove(tmp_file)
if __name__ == "__main__":
# 计算前,获取scada_info中的信息,按照设定的方法修改pg数据库