| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596 |
- import asyncio
- import sys
- import uvicorn
- import signal
- from api import *
- from sockets.socket_server import *
- import uvicorn.loops.auto
- import uvicorn.protocols.http.auto
- 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
- config = uvicorn.Config(
- APP_RUN,
- host=APP_HOST,
- port=int(PORT),
- reload=isDebug,
- workers=int(APP_WORKS),
- loop="auto",
- )
- server = uvicorn.Server(config)
- try:
- await server.serve()
- except asyncio.CancelledError:
- # 正确处理取消操作
- pass
- finally:
- # 确保服务器正确关闭
- if hasattr(server, "shutdown"):
- await server.shutdown()
- async def main():
- # 创建可取消的任务
- 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)
- 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,
- # host=APP_HOST,
- # port=int(PORT),
- # reload=isDebug,
- # loop="auto",
- # )
|