Files
wxauto_api/services/scheduler_service.py
T
2026-04-07 14:11:45 +08:00

67 lines
2.2 KiB
Python

# ///
# 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()