|
|
@@ -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)
|