
Python 的 schedule 库仅负责定义任务,不会自动运行;必须显式调用 schedule.run_pending() 并在循环中持续检查,否则定时任务永远不会触发。
python 的 `schedule` 库仅负责定义任务,不会自动运行;必须显式调用 `schedule.run_pending()` 并在循环中持续检查,否则定时任务永远不会触发。
schedule 是一个轻量级、易用的 Python 定时任务库,但它不是后台服务或守护进程——它本身不启动独立线程或事件循环,也不会自动轮询执行时间。你写的 schedule.every().day.at(...).do(...) 语句只是向调度器注册了一个任务,相当于“把闹钟设好”,但如果没有“一直盯着时钟并响铃”的机制,闹钟就永远不会响。
要让任务真正执行,必须在主程序中持续调用 schedule.run_pending(),该方法会扫描所有已注册任务,对到达执行时间的任务立即触发。典型做法是搭配 time.sleep() 构建一个轻量级轮询循环:
import schedule
import time
def test_schedule(test_string):
print(f"[{time.strftime('%Y-%m-%d %H:%M:%S')}] {test_string}")
# 注册每日任务(注意:时区需确保系统支持,如 'Europe/Madrid')
schedule.every().day.at("13:09:30", "Europe/Madrid").do(test_schedule, "test")
# 关键:启动调度循环
while True:
schedule.run_pending() # 检查并执行到期任务
time.sleep(1) # 避免 CPU 空转,每秒检查一次
✅ 注意事项与最佳实践:
- time.sleep() 的间隔不宜过长(如 60 秒),否则可能错过精确时间点;推荐 1 秒或更短(如 0.5)以兼顾精度与性能。
- 若在 Telegram Bot 等异步框架(如 aiogram 或 python-telegram-bot)中使用,请勿直接阻塞主线程(如 while True)。应将 run_pending() 集成到事件循环中,例如通过 asyncio.create_task() 启动后台调度协程,或使用 schedule.idle_seconds() 实现非阻塞等待。
- 时区参数(如 "Europe/Madrid")依赖 pytz 或 zoneinfo(Python ≥3.9),请确保已安装对应依赖:pip install pytz(旧版本)或无需额外安装(Python 3.9+ 使用内置 zoneinfo)。
- 调试建议:添加时间戳打印、使用 schedule.jobs 查看当前注册任务列表,或临时改用 schedule.every(10).seconds.do(...) 快速验证逻辑是否生效。
简言之:注册 ≠ 运行。schedule 是“被动调度器”,你必须主动驱动它——这是其设计哲学,也是绝大多数用户踩坑的根本原因。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











