Explorar o código

Merge branch 'dev-python' into smart-shooter-master

rambo hai 4 meses
pai
achega
e45bbb2dcc
Modificáronse 1 ficheiros con 40 adicións e 5 borrados
  1. 40 5
      python/index.py

+ 40 - 5
python/index.py

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