index.py 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. import asyncio
  2. import sys
  3. import uvicorn
  4. import signal
  5. from api import *
  6. from sockets.socket_server import *
  7. import uvicorn.loops.auto
  8. import uvicorn.protocols.http.auto
  9. import uvicorn.protocols.websockets.auto
  10. import uvicorn.lifespan.on
  11. from multiprocessing import Process, freeze_support
  12. from service.init_load_source import init_load_source
  13. def handle_shutdown(signum, frame):
  14. """关闭系统应用服务"""
  15. # 终止事件循环
  16. loop = asyncio.get_event_loop()
  17. # 适当地关闭服务器
  18. for task in asyncio.all_tasks(loop):
  19. print("清除:", task.get_name())
  20. task.cancel()
  21. loop.call_soon_threadsafe(loop.stop)
  22. sys.exit(0)
  23. async def run_server():
  24. # 启动uvicorn服务器
  25. isDebug = True if IS_DEBUG == "true" else False
  26. config = uvicorn.Config(
  27. APP_RUN,
  28. host=APP_HOST,
  29. port=int(PORT),
  30. reload=isDebug,
  31. workers=int(APP_WORKS),
  32. loop="auto",
  33. )
  34. server = uvicorn.Server(config)
  35. try:
  36. await server.serve()
  37. except asyncio.CancelledError:
  38. # 正确处理取消操作
  39. pass
  40. finally:
  41. # 确保服务器正确关闭
  42. if hasattr(server, "shutdown"):
  43. await server.shutdown()
  44. async def main():
  45. # 创建可取消的任务
  46. server_task = asyncio.create_task(run_server())
  47. load_task = asyncio.create_task(init_load_source().load_source())
  48. try:
  49. await asyncio.gather(server_task, load_task)
  50. except asyncio.CancelledError:
  51. # 取消所有任务
  52. for task in [server_task, load_task]:
  53. if not task.done():
  54. task.cancel()
  55. # 等待任务完成取消
  56. await asyncio.gather(server_task, load_task, return_exceptions=True)
  57. if __name__ == "__main__":
  58. if sys.platform == "win32":
  59. asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy())
  60. signal.signal(signal.SIGINT, handle_shutdown)
  61. signal.signal(signal.SIGTERM, handle_shutdown)
  62. print("python server is running at port:", PORT)
  63. print("python server is running at port:", APP_RUN)
  64. loop = asyncio.new_event_loop()
  65. asyncio.set_event_loop(loop)
  66. try:
  67. loop.run_until_complete(main())
  68. except KeyboardInterrupt:
  69. pass
  70. finally:
  71. # 清理所有挂起的任务
  72. pending = asyncio.all_tasks(loop)
  73. for task in pending:
  74. task.cancel()
  75. if pending:
  76. loop.run_until_complete(asyncio.gather(*pending, return_exceptions=True))
  77. loop.close()
  78. # isDebug = True if IS_DEBUG == "true" else False
  79. # uvicorn.run(
  80. # app=APP_RUN,
  81. # host=APP_HOST,
  82. # port=int(PORT),
  83. # reload=isDebug,
  84. # loop="auto",
  85. # )