# main.py import signal import time from datetime import datetime from system_management.scheduler.task_scheduler import TaskScheduler from utils.logger import CrossPlatformLog # 初始化日志 log = CrossPlatformLog.get_logger("Main") class IntelligenceSystem: def __init__(self, db_config=None): self.scheduler = TaskScheduler(db_config) self._running = False log.info("IntelligenceSystem initialized") def run(self): """启动系统主循环""" self._running = True self._register_signal_handlers() log.info("Starting main loop") try: while self._running: start_time = time.time() self._run_cycle() # 精确控制循环间隔(扣除执行时间) elapsed = time.time() - start_time sleep_time = max(0, 60 - elapsed) time.sleep(sleep_time) except KeyboardInterrupt: log.info("Received keyboard interrupt") except Exception as e: log.critical( "System crashed", exc_info=True ) raise finally: self.shutdown() def _run_cycle(self): """单个运行周期""" try: # 1. 执行任务调度 result = self.scheduler.run_pending_tasks() # 2. 每小时记录系统状态 if datetime.now().minute == 0: self._log_system_status() except Exception as e: log.error( "Cycle execution failed", exc_info=True ) raise def _log_system_status(self): """记录系统状态""" try: status_df = self.scheduler.get_task_status() pending = len(status_df[status_df['next_run_time'] <= datetime.now()]) log.info( "System status", pending_tasks=pending, active_tasks=len(status_df), last_success=status_df['last_run_time'].max() ) except Exception as e: log.error( "Failed to log system status", exc_info=True ) def _register_signal_handlers(self): """注册信号处理""" signal.signal(signal.SIGINT, self._handle_shutdown) signal.signal(signal.SIGTERM, self._handle_shutdown) log.debug("Signal handlers registered") def _handle_shutdown(self, signum, frame): """处理关闭信号""" log.info( f"Processing shutdown signal {signum}", signal=signum ) self._running = False def shutdown(self): """关闭系统""" log.info("Performing system shutdown") # 此处可添加其他清理逻辑 log.success("System shutdown completed") if __name__ == "__main__": try: system = IntelligenceSystem() system.run() except Exception as e: log.critical( "System startup failed", exc_info=True ) raise