scheduler.py 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. import time
  2. from logger_config import logger
  3. from config import get_search_keywords_from_db, has_running_task
  4. import main as main_module
  5. # 调度间隔:每 300 秒(5 分钟)检查一次
  6. POLL_SECONDS = 1800
  7. # 平台筛选:只处理 platform=9 的任务
  8. PLATFORM = 9
  9. def tick(platform: int = PLATFORM) -> None:
  10. """执行一轮调度检查。"""
  11. try:
  12. # 1) 先看是否已有执行中任务(status=2),有则跳过,避免打断
  13. if has_running_task(platform=platform):
  14. logger.info(f"[调度器] 检测到执行中任务(status=2, platform={platform}),本轮跳过。")
  15. return
  16. # 2) 查询待执行任务(status=1)
  17. tasks = get_search_keywords_from_db(platform=platform)
  18. logger.info(f"[调度器] 当前待执行任务数: {len(tasks)}")
  19. if not tasks:
  20. logger.info(f"[调度器] 未发现待执行任务(status=1, platform={platform})。")
  21. return
  22. # 3) 有任务则触发 main.py 单次执行流程
  23. logger.info(
  24. f"[调度器] 发现 {len(tasks)} 个待执行任务(platform={platform}),开始执行 main.main()。"
  25. )
  26. main_module.main()
  27. except Exception as e:
  28. logger.error(f"[调度器] 本轮调度执行失败: {str(e)}")
  29. def run_scheduler(interval_seconds: int = POLL_SECONDS, platform: int = PLATFORM) -> None:
  30. """持续运行调度器:启动后立即执行一次,随后按固定间隔轮询。"""
  31. logger.info(
  32. f"[调度器] 已启动,轮询间隔={interval_seconds}秒,platform={platform}。"
  33. f"启动后立即执行首轮检查。"
  34. )
  35. while True:
  36. # 记录本轮开始时间,用于计算剩余休眠时长
  37. started = time.time()
  38. try:
  39. tick(platform=platform)
  40. except Exception as e:
  41. logger.error(f"[调度器] 调度循环出现未预期异常: {str(e)}")
  42. # 休眠“间隔 - 本轮耗时”,保证轮询节奏稳定
  43. elapsed = time.time() - started
  44. sleep_seconds = max(0, interval_seconds - elapsed)
  45. logger.info(f"[调度器] 下一轮将在 {sleep_seconds:.1f} 秒后执行。")
  46. time.sleep(sleep_seconds)
  47. if __name__ == "__main__":
  48. run_scheduler()