import signal import time from datetime import datetime from system_management.scheduler.task_scheduler import TaskScheduler from utils.logger import CrossPlatformLog from config import Config # 初始化日志 log = CrossPlatformLog.get_logger("Main") class IntelligenceSystem: def __init__(self, db_config=None): """初始化系统(仅作为容器,不包含业务逻辑)""" self.scheduler = TaskScheduler(Config.MYSQL_CONFIG, max_workers=5) self._running = False log.info("情报系统已初始化(Cron模式)") def start(self): """启动系统主入口""" self._running = True self._setup_signal_handlers() log.info("系统启动 - 运行在Cron调度模式") try: # 主循环 - 仅负责定期检查任务 while self._running: # 检查并执行到期任务 self.scheduler.check_and_run_tasks() # 短间隔轮询(每10秒检查一次,保证Cron时间精度) time.sleep(10) except Exception as e: log.critical("系统主循环崩溃", exc_info=True) finally: self.shutdown() def _setup_signal_handlers(self): """设置系统信号处理器""" signal.signal(signal.SIGINT, self._handle_shutdown) signal.signal(signal.SIGTERM, self._handle_shutdown) log.debug("信号处理器已注册") def _handle_shutdown(self, signum, frame): """处理系统关闭信号""" log.info(f"收到关闭信号 {signum},开始关闭系统") self._running = False def shutdown(self): """优雅关闭系统""" log.info("开始优雅关闭系统") # 等待所有正在执行的任务完成 self.scheduler.executor.shutdown(wait=True, cancel_futures=False) # 记录最终状态 pending_count = self.scheduler.get_pending_tasks_count() log.info( "系统关闭完成", pending_tasks=pending_count, shutdown_time=datetime.now() ) if __name__ == "__main__": try: # 启动系统 - 仅作为入口,不包含调度逻辑 system = IntelligenceSystem() system.start() except Exception as e: log.critical("情报系统启动失败", exc_info=True) raise