调度系统开发
This commit is contained in:
@@ -1,4 +1,3 @@
|
||||
# main.py
|
||||
import signal
|
||||
import time
|
||||
from datetime import datetime
|
||||
@@ -11,101 +10,63 @@ log = CrossPlatformLog.get_logger("Main")
|
||||
|
||||
class IntelligenceSystem:
|
||||
def __init__(self, db_config=None):
|
||||
self.scheduler = TaskScheduler(db_config)
|
||||
"""初始化系统(仅作为容器,不包含业务逻辑)"""
|
||||
self.scheduler = TaskScheduler(db_config, max_workers=5)
|
||||
self._running = False
|
||||
log.info("IntelligenceSystem initialized")
|
||||
log.info("情报系统已初始化(Cron模式)")
|
||||
|
||||
def run(self):
|
||||
"""启动系统主循环"""
|
||||
def start(self):
|
||||
"""启动系统主入口"""
|
||||
self._running = True
|
||||
self._register_signal_handlers()
|
||||
|
||||
log.info("Starting main loop")
|
||||
self._setup_signal_handlers()
|
||||
log.info("系统启动 - 运行在Cron调度模式")
|
||||
|
||||
try:
|
||||
# 主循环 - 仅负责定期检查任务
|
||||
while self._running:
|
||||
start_time = time.time()
|
||||
self._run_cycle()
|
||||
# 检查并执行到期任务
|
||||
self.scheduler.check_and_run_tasks()
|
||||
|
||||
# 精确控制循环间隔(扣除执行时间)
|
||||
elapsed = time.time() - start_time
|
||||
sleep_time = max(0, 60 - elapsed)
|
||||
time.sleep(sleep_time)
|
||||
# 短间隔轮询(每10秒检查一次,保证Cron时间精度)
|
||||
time.sleep(10)
|
||||
|
||||
except KeyboardInterrupt:
|
||||
log.info("Received keyboard interrupt")
|
||||
except Exception as e:
|
||||
log.critical(
|
||||
"System crashed",
|
||||
exc_info=True
|
||||
)
|
||||
raise
|
||||
log.critical("系统主循环崩溃", exc_info=True)
|
||||
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):
|
||||
"""注册信号处理"""
|
||||
def _setup_signal_handlers(self):
|
||||
"""设置系统信号处理器"""
|
||||
signal.signal(signal.SIGINT, self._handle_shutdown)
|
||||
signal.signal(signal.SIGTERM, self._handle_shutdown)
|
||||
log.debug("Signal handlers registered")
|
||||
log.debug("信号处理器已注册")
|
||||
|
||||
def _handle_shutdown(self, signum, frame):
|
||||
"""处理关闭信号"""
|
||||
log.info(
|
||||
f"Processing shutdown signal {signum}",
|
||||
signal=signum
|
||||
)
|
||||
"""处理系统关闭信号"""
|
||||
log.info(f"收到关闭信号 {signum},开始关闭系统")
|
||||
self._running = False
|
||||
|
||||
def shutdown(self):
|
||||
"""关闭系统"""
|
||||
log.info("Performing system shutdown")
|
||||
# 此处可添加其他清理逻辑
|
||||
log.success("System shutdown completed")
|
||||
"""优雅关闭系统"""
|
||||
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.run()
|
||||
system.start()
|
||||
except Exception as e:
|
||||
log.critical(
|
||||
"System startup failed",
|
||||
exc_info=True
|
||||
)
|
||||
log.critical("情报系统启动失败", exc_info=True)
|
||||
raise
|
||||
|
||||
Reference in New Issue
Block a user