scheduler.py 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. #!/usr/bin env python
  2. # -*- coding: utf-8 -*-
  3. """
  4. 调度器
  5. """
  6. from typing import Callable, Dict, Tuple, Any, Optional, List
  7. from apscheduler.schedulers.blocking import BlockingScheduler
  8. from apscheduler.triggers.cron import CronTrigger
  9. # 任务注册表
  10. JOBS: Dict[str, Dict[str, Any]] = {}
  11. def register(
  12. name: str,
  13. func: Callable,
  14. cron: str,
  15. enabled: bool = True
  16. ) -> None:
  17. """
  18. 注册任务
  19. Args:
  20. name: 任务名称
  21. func: 执行函数
  22. cron: cron 表达式
  23. enabled: 是否启用
  24. """
  25. JOBS[name] = {
  26. "func": func,
  27. "cron": cron,
  28. "enabled": enabled
  29. }
  30. def run_job(
  31. name: str,
  32. start_date: Optional[str] = None,
  33. end_date: Optional[str] = None,
  34. group_id: Optional[str] = None
  35. ) -> None:
  36. """
  37. 运行指定任务
  38. Args:
  39. name: 任务名称
  40. start_date: 开始日期
  41. end_date: 结束日期
  42. group_id: 集团ID
  43. """
  44. job = JOBS.get(name)
  45. if not job:
  46. raise ValueError(f"任务 {name} 不存在")
  47. func = job["func"]
  48. if group_id:
  49. func(start_date, end_date, group_id)
  50. elif start_date and end_date:
  51. func(start_date, end_date)
  52. else:
  53. func()
  54. def list_jobs() -> List[Tuple[str, str, bool]]:
  55. """列出所有任务"""
  56. return [
  57. (name, job["cron"], job["enabled"])
  58. for name, job in JOBS.items()
  59. ]
  60. def start_scheduler() -> None:
  61. """启动调度器"""
  62. scheduler = BlockingScheduler(timezone="Asia/Shanghai")
  63. for name, job in JOBS.items():
  64. if not job["enabled"]:
  65. print(f"[跳过] {name} (已禁用)")
  66. continue
  67. trigger = CronTrigger.from_crontab(
  68. job["cron"],
  69. timezone="Asia/Shanghai"
  70. )
  71. scheduler.add_job(job["func"], trigger=trigger, id=name, name=name)
  72. print(f"[注册] {name} - {job['cron']}")
  73. print("=" * 50)
  74. print("调度器启动中...")
  75. print("按 Ctrl+C 停止")
  76. print("=" * 50)
  77. try:
  78. scheduler.start()
  79. except KeyboardInterrupt:
  80. print("收到停止信号")
  81. scheduler.shutdown()