| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100 |
- #!/usr/bin env python
- # -*- coding: utf-8 -*-
- """
- 调度器
- """
- from typing import Callable, Dict, Tuple, Any, Optional, List
- from apscheduler.schedulers.blocking import BlockingScheduler
- from apscheduler.triggers.cron import CronTrigger
- # 任务注册表
- JOBS: Dict[str, Dict[str, Any]] = {}
- def register(
- name: str,
- func: Callable,
- cron: str,
- enabled: bool = True
- ) -> None:
- """
- 注册任务
-
- Args:
- name: 任务名称
- func: 执行函数
- cron: cron 表达式
- enabled: 是否启用
- """
- JOBS[name] = {
- "func": func,
- "cron": cron,
- "enabled": enabled
- }
- def run_job(
- name: str,
- start_date: Optional[str] = None,
- end_date: Optional[str] = None,
- group_id: Optional[str] = None
- ) -> None:
- """
- 运行指定任务
-
- Args:
- name: 任务名称
- start_date: 开始日期
- end_date: 结束日期
- group_id: 集团ID
- """
- job = JOBS.get(name)
- if not job:
- raise ValueError(f"任务 {name} 不存在")
-
- func = job["func"]
-
- if group_id:
- func(start_date, end_date, group_id)
- elif start_date and end_date:
- func(start_date, end_date)
- else:
- func()
- def list_jobs() -> List[Tuple[str, str, bool]]:
- """列出所有任务"""
- return [
- (name, job["cron"], job["enabled"])
- for name, job in JOBS.items()
- ]
- def start_scheduler() -> None:
- """启动调度器"""
- scheduler = BlockingScheduler(timezone="Asia/Shanghai")
-
- for name, job in JOBS.items():
- if not job["enabled"]:
- print(f"[跳过] {name} (已禁用)")
- continue
-
- trigger = CronTrigger.from_crontab(
- job["cron"],
- timezone="Asia/Shanghai"
- )
- scheduler.add_job(job["func"], trigger=trigger, id=name, name=name)
- print(f"[注册] {name} - {job['cron']}")
-
- print("=" * 50)
- print("调度器启动中...")
- print("按 Ctrl+C 停止")
- print("=" * 50)
-
- try:
- scheduler.start()
- except KeyboardInterrupt:
- print("收到停止信号")
- scheduler.shutdown()
|