|
|
@@ -10,13 +10,20 @@ import uvicorn.protocols.websockets.auto
|
|
|
import uvicorn.lifespan.on
|
|
|
from multiprocessing import Process, freeze_support
|
|
|
from service.init_load_source import init_load_source
|
|
|
+
|
|
|
+
|
|
|
def handle_shutdown(signum, frame):
|
|
|
"""关闭系统应用服务"""
|
|
|
- # 终止事件循环
|
|
|
+ # 终止事件循环
|
|
|
loop = asyncio.get_event_loop()
|
|
|
+ # 适当地关闭服务器
|
|
|
+ for task in asyncio.all_tasks(loop):
|
|
|
+ print("清除:", task.get_name())
|
|
|
+ task.cancel()
|
|
|
loop.call_soon_threadsafe(loop.stop)
|
|
|
sys.exit(0)
|
|
|
|
|
|
+
|
|
|
async def run_server():
|
|
|
# 启动uvicorn服务器
|
|
|
isDebug = True if IS_DEBUG == "true" else False
|
|
|
@@ -29,12 +36,31 @@ async def run_server():
|
|
|
loop="auto",
|
|
|
)
|
|
|
server = uvicorn.Server(config)
|
|
|
- await server.serve()
|
|
|
+ try:
|
|
|
+ await server.serve()
|
|
|
+ except asyncio.CancelledError:
|
|
|
+ # 正确处理取消操作
|
|
|
+ pass
|
|
|
+ finally:
|
|
|
+ # 确保服务器正确关闭
|
|
|
+ if hasattr(server, "shutdown"):
|
|
|
+ await server.shutdown()
|
|
|
+
|
|
|
|
|
|
async def main():
|
|
|
- # await init_load_source().load_source()
|
|
|
- # await run_server()
|
|
|
- await asyncio.gather(run_server(), init_load_source().load_source())
|
|
|
+ # 创建可取消的任务
|
|
|
+ server_task = asyncio.create_task(run_server())
|
|
|
+ load_task = asyncio.create_task(init_load_source().load_source())
|
|
|
+
|
|
|
+ try:
|
|
|
+ await asyncio.gather(server_task, load_task)
|
|
|
+ except asyncio.CancelledError:
|
|
|
+ # 取消所有任务
|
|
|
+ for task in [server_task, load_task]:
|
|
|
+ if not task.done():
|
|
|
+ task.cancel()
|
|
|
+ # 等待任务完成取消
|
|
|
+ await asyncio.gather(server_task, load_task, return_exceptions=True)
|
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
|
|
@@ -47,9 +73,18 @@ if __name__ == "__main__":
|
|
|
print("python server is running at port:", APP_RUN)
|
|
|
|
|
|
loop = asyncio.new_event_loop()
|
|
|
+ asyncio.set_event_loop(loop)
|
|
|
try:
|
|
|
loop.run_until_complete(main())
|
|
|
+ except KeyboardInterrupt:
|
|
|
+ pass
|
|
|
finally:
|
|
|
+ # 清理所有挂起的任务
|
|
|
+ pending = asyncio.all_tasks(loop)
|
|
|
+ for task in pending:
|
|
|
+ task.cancel()
|
|
|
+ if pending:
|
|
|
+ loop.run_until_complete(asyncio.gather(*pending, return_exceptions=True))
|
|
|
loop.close()
|
|
|
# isDebug = True if IS_DEBUG == "true" else False
|
|
|
# uvicorn.run(
|