index.py 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  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. import socket
  14. def handle_shutdown(signum, frame):
  15. """关闭系统应用服务"""
  16. # 终止事件循环
  17. loop = asyncio.get_event_loop()
  18. # 适当地关闭服务器
  19. for task in asyncio.all_tasks(loop):
  20. print("清除:", task.get_name())
  21. task.cancel()
  22. loop.call_soon_threadsafe(loop.stop)
  23. sys.exit(0)
  24. async def run_server():
  25. # 启动uvicorn服务器
  26. isDebug = True if IS_DEBUG == "true" else False
  27. config = uvicorn.Config(
  28. APP_RUN,
  29. host=APP_HOST,
  30. port=int(PORT),
  31. workers=int(APP_WORKS),
  32. loop="asyncio",
  33. ws_ping_interval=20, # 每 20 秒发一次 WebSocket Ping 帧
  34. ws_ping_timeout=10, # 等待 Pong 最多 10 秒
  35. )
  36. # 创建自定义 socket
  37. server = uvicorn.Server(config)
  38. try:
  39. await server.serve()
  40. except asyncio.CancelledError:
  41. # 正确处理取消操作
  42. pass
  43. finally:
  44. # 确保服务器正确关闭
  45. if hasattr(server, "shutdown"):
  46. await server.shutdown()
  47. async def main():
  48. # 创建可取消的任务
  49. server_task = asyncio.create_task(run_server())
  50. load_task = asyncio.create_task(init_load_source().load_source())
  51. try:
  52. await asyncio.gather(server_task, load_task)
  53. except asyncio.CancelledError:
  54. # 取消所有任务
  55. for task in [server_task, load_task]:
  56. if not task.done():
  57. task.cancel()
  58. # 等待任务完成取消
  59. await asyncio.gather(server_task, load_task, return_exceptions=True)
  60. if __name__ == "__main__":
  61. if sys.platform == "win32":
  62. asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy())
  63. signal.signal(signal.SIGINT, handle_shutdown)
  64. signal.signal(signal.SIGTERM, handle_shutdown)
  65. print("python server is running at port:", PORT)
  66. print("python server is running at port:", APP_RUN)
  67. loop = asyncio.new_event_loop()
  68. asyncio.set_event_loop(loop)
  69. try:
  70. loop.run_until_complete(main())
  71. except KeyboardInterrupt:
  72. pass
  73. finally:
  74. # 清理所有挂起的任务
  75. pending = asyncio.all_tasks(loop)
  76. for task in pending:
  77. task.cancel()
  78. if pending:
  79. loop.run_until_complete(asyncio.gather(*pending, return_exceptions=True))
  80. loop.close()
  81. # isDebug = True if IS_DEBUG == "true" else False
  82. # uvicorn.run(
  83. # app=APP_RUN,
  84. # host=APP_HOST,
  85. # port=int(PORT),
  86. # reload=isDebug,
  87. # loop="auto",
  88. # )