signals.py 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. """
  2. 操作系统信号和 Windows 控制台事件处理。
  3. """
  4. import sys
  5. import signal
  6. from foundation.observability.logger.loggering import server_logger
  7. def setup_signal_handlers(shutdown_callback):
  8. """注册信号处理器,shutdown_callback 会在收到终止信号时调用。"""
  9. def handler(signum, frame):
  10. server_logger.info(f"收到信号 {signum},正在停止服务...")
  11. shutdown_callback()
  12. sys.exit(0)
  13. try:
  14. signal.signal(signal.SIGINT, handler)
  15. signal.signal(signal.SIGTERM, handler)
  16. except AttributeError:
  17. pass
  18. if sys.platform == 'win32':
  19. _setup_windows_handler(shutdown_callback)
  20. def _setup_windows_handler(shutdown_callback):
  21. try:
  22. import win32api
  23. def win32_handler(dwCtrlType):
  24. CTRL_C_EVENT = 0
  25. CTRL_BREAK_EVENT = 1
  26. CTRL_CLOSE_EVENT = 2
  27. CTRL_SHUTDOWN_EVENT = 6
  28. if dwCtrlType in (CTRL_C_EVENT, CTRL_BREAK_EVENT, CTRL_CLOSE_EVENT, CTRL_SHUTDOWN_EVENT):
  29. server_logger.info(f"收到Windows控制台事件 {dwCtrlType},正在停止服务...")
  30. shutdown_callback()
  31. sys.exit(0)
  32. return False
  33. win32api.SetConsoleCtrlHandler(win32_handler, True)
  34. except (ImportError, AttributeError) as e:
  35. server_logger.debug(f"Windows控制台事件处理不可用: {e}")