feat(scada): add calibrated monitoring and incident recovery
This commit is contained in:
+44
-8
@@ -1,22 +1,58 @@
|
||||
import argparse
|
||||
import asyncio
|
||||
import os
|
||||
import sys
|
||||
from typing import Any
|
||||
|
||||
import uvicorn
|
||||
|
||||
# 将项目根目录添加到 python 路径
|
||||
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), "..")))
|
||||
|
||||
|
||||
def build_server_options(argv: list[str] | None = None) -> dict[str, Any]:
|
||||
parser = argparse.ArgumentParser(description="Run the TJWater API server")
|
||||
parser.add_argument("--host", default="0.0.0.0")
|
||||
parser.add_argument("--port", type=int, default=8000)
|
||||
parser.add_argument("--reload", action="store_true")
|
||||
parser.add_argument("--reload-dir", action="append", default=[])
|
||||
parser.add_argument("--startup-timeout", type=int, default=60)
|
||||
args = parser.parse_args(argv)
|
||||
if args.startup_timeout <= 0:
|
||||
parser.error("--startup-timeout must be positive")
|
||||
return {
|
||||
"app": "app.main:app",
|
||||
"host": args.host,
|
||||
"port": args.port,
|
||||
"reload": args.reload,
|
||||
"reload_dirs": args.reload_dir,
|
||||
"startup_timeout": args.startup_timeout,
|
||||
"loop": "asyncio",
|
||||
}
|
||||
|
||||
|
||||
def main() -> None:
|
||||
from pathlib import Path
|
||||
from scripts.server_handoff import HandoffSupervisor
|
||||
|
||||
options = build_server_options()
|
||||
reload_enabled = options.pop("reload")
|
||||
reload_dirs = options.pop("reload_dirs")
|
||||
startup_timeout = options.pop("startup_timeout")
|
||||
if reload_enabled:
|
||||
HandoffSupervisor(
|
||||
uvicorn.Config(**options),
|
||||
startup_timeout=startup_timeout,
|
||||
reload_dirs=[Path(directory) for directory in reload_dirs] or None,
|
||||
readiness_check="app.api.health:metadata_database_ready",
|
||||
).run()
|
||||
else:
|
||||
uvicorn.run(**options)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
# Windows 设置事件循环策略
|
||||
if sys.platform == "win32":
|
||||
asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy())
|
||||
|
||||
# 用 uvicorn.run 支持 workers 参数
|
||||
uvicorn.run(
|
||||
"app.main:app",
|
||||
host="0.0.0.0",
|
||||
port=8000,
|
||||
# workers=2, # 这里可以设置多进程
|
||||
loop="asyncio",
|
||||
)
|
||||
main()
|
||||
|
||||
Reference in New Issue
Block a user