rambo 1 anno fa
parent
commit
a69bc3d750
1 ha cambiato i file con 18 aggiunte e 5 eliminazioni
  1. 18 5
      python/main.py

+ 18 - 5
python/main.py

@@ -1,10 +1,12 @@
 import argparse
+import asyncio
 import signal
+import uvicorn
 import sys
 from api import *
 import uvicorn
 import configparser, json
-
+SHUTDOWN_TIMEOUT = 10
 # ===============默认数据配置=====================
 config = configparser.ConfigParser()
 config_name = "config.ini"
@@ -13,7 +15,7 @@ config.read(config_name)
 parser = argparse.ArgumentParser(description="Process some integers.")
 parser.add_argument("--port", type=int, default=7074, help="The port number.")
 args = parser.parse_args()
-
+server = uvicorn.Server(uvicorn.Config(app))
 
 # 通过信号来退出服务,否则会出现终端显示退出后,实际进程仍在运行
 # 定义信号处理函数
@@ -22,9 +24,17 @@ def signal_handler(sig, frame):
     sys.exit(0)
 
 
-# 注册信号处理函数
-signal.signal(signal.SIGTERM, signal_handler)
-signal.signal(signal.SIGINT, signal_handler)
+@app.on_event("shutdown")
+async def shutdown():
+    server.should_exit = True
+    await asyncio.sleep(3)
+
+
+async def force_shutdown():
+    await asyncio.sleep(SHUTDOWN_TIMEOUT)
+    if not server.should_exit:
+        server.force_exit = True
+
 
 if __name__ == "__main__":
     # 以api方式启动服务会出现警告,请忽略
@@ -32,12 +42,15 @@ if __name__ == "__main__":
     host = config.get("app", "host")
     port = config.get("app", "port")
     debug = config.get("app", "debug")
+    server.install_signal_handlers()
+    asyncio.ensure_future(force_shutdown())
     uvicorn.run(
         app="main:app",
         host=host,
         port=int(port),
         reload=bool(debug),
     )
+    # 注册信号处理函数
     # 或许flask内置的stdio与node.js stdio有冲突,导致控制台无法显示信息。
     # 如果想要查看控制台输出,请单独启动服务 npm run dev-python
     print("python server is running at port:", port)