Procházet zdrojové kódy

关闭异步事件

rambo před 4 měsíci
rodič
revize
3a4724b30c
1 změnil soubory, kde provedl 49 přidání a 6 odebrání
  1. 49 6
      python/index.py

+ 49 - 6
python/index.py

@@ -11,13 +11,19 @@ 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
@@ -27,22 +33,59 @@ async def run_server():
         port=int(PORT),
         reload=isDebug,
         workers=int(APP_WORKS),
+        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__":
+    if sys.platform == "win32":
+        asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy())
+
     signal.signal(signal.SIGINT, handle_shutdown)
     signal.signal(signal.SIGTERM, handle_shutdown)
     print("python server is running at port:", PORT)
     print("python server is running at port:", APP_RUN)
-    asyncio.run(main())
+
+    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(
     #     app=APP_RUN,