# /// # scheduler_service.py # 描述:定时任务调度服务,支持 cron 表达式 # 作者:AI Generated # 创建日期:2026-04-06 # /// import asyncio from typing import Dict, Any from croniter import croniter from plugins.base import PluginRegistry from services.log_service import log_service class SchedulerService: def __init__(self): self._running = False self._task = None self._last_run_times: Dict[str, float] = {} async def start(self): if self._running: return self._running = True self._task = asyncio.create_task(self._scheduler_loop()) log_service.info("调度服务启动", "Scheduler") async def stop(self): self._running = False if self._task: self._task.cancel() try: await self._task except asyncio.CancelledError: pass log_service.info("调度服务已停止", "Scheduler") async def _scheduler_loop(self): while self._running: try: await self._check_and_run_tasks() except Exception as e: log_service.error(f"调度循环错误: {e}", "Scheduler") await asyncio.sleep(10) async def _check_and_run_tasks(self): tasks = PluginRegistry.get_scheduled_tasks() import time current_time = time.time() for task in tasks: try: should_run, next_run = task.should_run_and_get_next() if should_run: log_service.info(f"执行定时任务: {task.plugin_name}", "Scheduler") result = task.run_task() if result.get("success"): log_service.success(f"定时任务完成: {task.plugin_name}", "Scheduler") else: log_service.error(f"定时任务失败: {task.plugin_name} - {result.get('error')}", "Scheduler") self._last_run_times[task.plugin_name] = current_time except Exception as e: log_service.error(f"执行定时任务 {task.plugin_name} 出错: {e}", "Scheduler") scheduler_service = SchedulerService()