Python 定时任务入门:让脚本每天定时自动执行的正确姿势
写 Python 脚本的人,迟早会遇到一个需求:这段代码别只跑一次,每天早上 8 点自动执行一遍。比如定时抓取数据、定时发通知、定时清理临时目录。这篇文章记录一个最小可用方案,从安装到部署,一次跑通。
一、安装 schedule 库
pip install schedule
它是纯 Python 实现,没有额外依赖,Windows 和 Linux 都能直接用,特别适合个人脚本和轻量自动化场景。
二、最小可运行示例
import schedule
import time
def job():
print("任务执行:", time.strftime("%Y-%m-%d %H:%M:%S"))
# 每天早上 8 点执行
schedule.every().day.at("08:00").do(job)
# 每 10 分钟执行一次
schedule.every(10).minutes.do(job)
# 每周一执行
schedule.every().monday.do(job)
while True:
schedule.run_pending()
time.sleep(1)
run_pending() 会检查有没有到期的任务,有就执行。外层的 while 让进程一直活着,每秒检查一次。这个模型简单粗暴,但对"每天跑几件事"来说足够了。
三、一个容易踩的坑:任务抛异常,进程就停了
schedule 默认不捕获任务里的异常。一旦 job() 抛错,整个 while 循环直接崩掉,定时任务从此静默失效,而且很可能没人发现。所以正式使用时,一定要在任务内部做好异常处理:
def job():
try:
run_my_task() # 真正的业务逻辑
except Exception as e:
with open("job_error.log", "a", encoding="utf-8") as f:
f.write(f"{time.strftime('%F %T')} {e}\n")
再配一个 logging 把每次执行记录落盘,出问题时至少能看到最后一次运行的时间和原因。
四、电脑关机,任务就不会跑
schedule 的调度依赖活着的进程:机器休眠、进程被杀,任务都停。所以真正的部署一般有两种思路:一是把常驻进程交给系统托管,Linux 上用 systemd 或 supervisor,进程崩了会自动拉起,Windows 上可以用计划任务设置开机启动;二是对执行时刻不敏感的场景,干脆不用常驻进程,直接让 crontab 或 Windows 任务计划程序到点调起脚本,跑完退出,反而更省心。
五、什么时候该换 APScheduler
如果后面出现"任务越来越多、有的要精确到秒、有的错过了还想补跑、有的要持久化到数据库",就可以升级到 APScheduler。它的 cron 触发器支持错过任务补偿和数据库任务存储,代价是配置明显复杂。个人建议:单纯每天定时跑几件事,schedule 就够了,别一上来就上重型框架。
写在最后
定时任务的核心其实不在代码量,而在三件事:异常不外泄、日志可追溯、进程有人管。把这三个问题处理好,一个十几行的脚本也能稳定运行很久。
- 点赞
- 收藏
- 关注作者
评论(0)