Python定时任务实现方案:从基础到持久化
本文详细介绍Python中实现定时任务的多种方案。从基础的sleep循环到轻量级的schedule库,再到企业级的Jenkins和Celery,最后重点讲解支持持久化的ApScheduler。通过对比各方案的优缺点及适用场景,帮助开发者根据实际需求选择最合适的定时任务执行策略。
本文旨在从零构建一个开源接口测试平台,并配套提供完整的操作教程,欢迎读者关注与支持。
1、定时任务概述
定时任务指在指定时间点或周期性地自动执行的操作,其内容可以是简单的bash命令,也可以是复杂的脚本文件。这类机制通常用于满足特定时刻执行后台任务的需求。
例如,可以设定每晚8点自动执行全业务场景的接口自动化回归测试,或者每隔20分钟执行一次类似“QQ农场偷菜”的周期性操作。
2、Python环境下的定时任务实现
在中大型企业中,通常会部署专门的分布式任务调度平台,或者使用Jenkins等工具来满足需求。
回顾博主早期工作经历,当时公司既未使用jenkins,也没有接入大型调度平台。在这种环境下,如何实现定时任务成为了一个实际问题。
下面展示一种基础的实现方式代码:
import time
from datetime import datetime
def func():
# 这个是定时任务要执行的ui/接口自动化方法
pass
def main():
while True:
# 获取当前时间
now = datetime.now()
if now.hour == 20 and now.minute == 0:
# 当时间到达晚上8点0分,我们就开始跑自动化任务啦
print("任务开始执行")
func()
time.sleep(60)
if __name__ == "__main__":
main()
尽管目前仍有人沿用此类方式执行自动化测试,但考虑到2021年后的技术演进,我们应探索更先进的方案。接下来将探讨在Python中如何更优雅地实现定时任务。
2.1 常见实现方案对比
2.1.1 schedule库
如果需求较为简单,建议直接使用schedule库。该库可视为基础sleep机制的升级版,针对sleep任务进行了功能扩展:
- 支持按固定周期执行任务
- 执行时间的配置更加直观易读
- 支持指定星期几执行任务
安装scheduler库
pip install schedule
参考官网提供的示例代码
import schedule
import time
# 定义一个执行方法
def job():
print("I'm working...")
# 每10分钟执行一次job
schedule.every(10).minutes.do(job)
# 每小时执行一次job
schedule.every().hour.do(job)
# 每天10:30执行job
schedule.every().day.at("10:30").do(job)
# 每个星期一执行一次
schedule.every().monday.do(job)
# 每个星期三的13:15执行一次
schedule.every().wednesday.at("13:15").do(job)
# 在每分钟的17秒执行一次
schedule.every().minute.at(":17").do(job)
while True:
# 进入schedule循环
schedule.run_pending()
time.sleep(1)
从API设计来看,其语义清晰且使用简单,基本能满足常规定时执行的需求。若仅需执行简单的定时任务,该库是一个human的选择。
2.1.2 Jenkins
相信大家对~jenkins并不陌生,这是一款功能强大的软件,能够打通git/svn版本控制系统,并支持定时任务调度。它拥有丰富的插件生态(如邮件通知),提供了一套完整的CI/CD解决方案,且任务执行结果可追溯。其潜在缺点是引入了额外的系统复杂度,对于原本简单的自动化测试框架而言,搭建一套jenkins可能显得过重。
若项目存在代码提交后触发定时任务的需求,且对权限控制有严格要求,Jenkins将是理想选择。
2.1.3 Celery

我对Celery的了解有限,但python+celery的组合似乎已成为固定搭配。我的理解如下:
celery作为一个任务队列,允许用户制定任务执行规则并放入队列,由专门的消费端负责执行这些任务。
在此不得不提及数据持久化的问题。
2.2 题外话:关于数据持久化
持久化是指将瞬时数据(如内存中的数据,断电即失)转化为持久数据(如存储至数据库或磁盘,可长期保存)的过程。
数据可以存储为文件,也可以存入数据库(底层仍为磁盘存储)以实现持久性保存。
这样做的目的是确保数据可被存储并在后续再次获取。由于内容较多,计划后续单独章节详述。
在Python中,变量及数据通常存放在内存中,因此前文提到的schedule默认不支持持久化(也可能是我尚未深入研究其高级特性)。
那么jenkins是否支持持久化呢?答案是肯定的。当你建立项目时,其中包含的job配置(如执行时间、任务内容等)会被保存下来。
上述过程即为持久化的体现。
保存数据后,下次启动即可获取该项目的任务信息。即使jenkins重启,任务配置依然存在。
这意味着任务本身作为一条数据记录,被持久化保存了起来。
2.2.1 ApScheduler
"APScheduler是一个Python库,允许安排稍后执行的Python代码,支持一次性或定期执行。用户可以根据需要添加新作业或删除旧作业。如果将作业存储在数据库中,即使调度程序重启,作业状态也能得以保留。重启调度程序时,它将运行在离线期间应执行的所有作业。
以上摘自ApScheduler官网介绍,总体而言,它支持对任务的增删改查(持久化),并能很好地支撑定时任务的执行。相比celery,它更为轻量;相比schedule,它功能更完善。由于我们不打算引入jenkins,因此ApScheduler堪称执行定时任务的不二之选。
至此,关于Python定时任务实现方案的介绍结束。如需了解更多Python定时任务相关内容,请搜索本站历史文章或继续浏览后续文章,感谢大家的支持!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













