# -*- coding: utf-8 -*- # Author : Charley # Python : 3.12.10 # Date : 2026/08/24 """得卡 DECA · 报告统一调度启动器(一个进程同时跑:每日报告 + 魔都周报)。 背景:daily_report.py 与 weekly_report.py 各自有独立的 schedule 阻塞循环,原需分别起两个进程。 本文件把两者的 run_once 注册到同一个 schedule,单进程单循环统一调度: - 每日报告 daily_report.run_once :每天 09:10(生成 + 发企微,口径见 daily_report.py) - 魔都周报 weekly_report.run_once:每周一 09:20(生成 + 发企微,口径见 weekly_report.py) 不改动 daily_report.py / weekly_report.py,只复用它们的 run_once(各报告仍可单独 python 直接跑)。 日志:统一写 stats/logs/scheduler_YYYYMMDD.log(单进程一份,便于排障)。两个报告脚本各自 standalone 运行时仍写自己的日志文件,互不影响。 运行:python run_scheduler.py(从 stats 目录启动;本文件会 chdir 到自身目录,保证 mysql_pool 读 stats/application.yml、每日报告产出也落 stats)。Ctrl+C 退出。 """ import os import sys import time # 固定工作目录到本文件所在的 stats:mysql_pool 读此目录 application.yml,daily 报告(cwd 相对)产出也落此 BASE_DIR = os.path.dirname(os.path.abspath(__file__)) os.chdir(BASE_DIR) sys.path.insert(0, os.path.dirname(BASE_DIR)) # 根目录加入 path(auto_send_wx_msg 等公共模块在根目录) import schedule from loguru import logger # 导入两个报告模块(复用其 run_once)。导入会触发各模块级 logger 配置,下面再统一覆盖为调度器日志。 import daily_report import weekly_report # 统一日志:覆盖两个模块 import 时各自加的 sink,调度器只留一份合并日志 logger.remove() logger.add(os.path.join(BASE_DIR, "logs", "scheduler_{time:YYYYMMDD}.log"), encoding="utf-8", rotation="00:00", format="[{time:YYYY-MM-DD HH:mm:ss.SSS}] {level} {message}", level="INFO", retention="7 day") def _run_daily(): """调度回调:跑每日报告;异常内部兜底,避免单次失败拖垮整个调度循环。""" try: daily_report.run_once(logger) except Exception as e: logger.error(f"每日报告运行异常: {e}") def _run_weekly(): """调度回调:跑魔都周报;异常内部兜底,避免单次失败拖垮整个调度循环。""" try: weekly_report.run_once(logger) except Exception as e: logger.error(f"魔都周报运行异常: {e}") def main(): """注册两个定时任务到同一 schedule 并进入单循环调度。""" # 调试:需启动时立即各跑一次,取消下面两行注释 _run_daily() # _run_weekly() schedule.every().day.at("09:10").do(_run_daily) # 每日报告:每天 09:10 schedule.every().monday.at("09:20").do(_run_weekly) # 魔都周报:每周一 09:20(错开 10 分钟) logger.info("调度器启动:每日报告 每天 09:10 / 魔都周报 每周一 09:20(Ctrl+C 退出)") while True: schedule.run_pending() time.sleep(1) if __name__ == "__main__": main()