Python定时任务实现方案
作者:米洛丶 发布时间:2021-05-05 04:11:54
我正在从0到1打造一个开源的接口测试平台, 也在编写一套与之对应的完整教程,希望大家多多支持。
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
任务做了一些扩展:
支持了按周期执行任务
执行时间阅读起来更人性化
还支持星期X执行
安装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
我对这家伙了解的不太多,但python+celery
仿佛成了一个固定搭配。不知道我理解的对不对:
celery
是一个任务队列,你可以制定好任务执行的规则,放入队列中,会有专门的消费端来帮你执行这些任务。
说到这里就不得不提到持久化了~
2.2 题外话之持久化
什么是持久化呢?通俗的讲,就是瞬时数据(比如内存中的数据,是不能永久保存的)持久化为持久数据(比如持久化至数据库中,能够长久保存)
我们可以把数据放到文件里,也可以放到数据库(实际上也是磁盘里)进行持久性保存。
这样做的目的: 数据可以存储,下次也还能拿到这些数据。这里面的内容太多了,打算后面再开一节来讲。
我们在Python
里面的变量啊,这些数据都是存放在内存当中的,所以我们刚才的schedule
是不支持持久化的。(也可能是我没研究到)
那jenkins
支持吗?他是支持的,你想,你建立一个项目,里面有一些job
的配置,什么时候执行,执行了干嘛,最后保存。
上述就是一个持久化的过程。
你保存了数据以后,下次能够获取到这个项目的任务信息,也就是说你哪怕重启了jenkins
,任务依然存在。
说明任务本身作为了一条数据,持久地保存了起来。
2.2.1 ApScheduler
"APScheduler
是一个Python
库,可让您安排稍后要执行的Python
代码,只需一次或定期执行。您可以根据您添加新的作业或删除旧的旧作业。如果您在数据库中存储工作,他们还将存活调度程序重新启动并保持状态。重新启动调度程序时,它将运行它在脱机1时应该运行的所有作业。"
这是摘自ApScheduler
官网的介绍,总体来说它支持对任务的增删改查(持久化),也能很好地支撑定时任务的执行。它相对来说比较轻量,不像celery
那么复杂,也不像schedule
那么简陋。由于我们不打算引入jenkins
,所以总体来说,ApScheduler
算得上是咱们执行定时任务的不二之选了。
来源:https://www.cnblogs.com/we8fans/p/15509529.html


猜你喜欢
- 前言读写文件是最常见的IO操作。Python内置了读写文件的函数,用法和C是兼容的。读写文件前,我们先必须了解一下,在磁盘上读写文件的功能都
- 本文是基于Apache poi类实现的批量导入读取Excel文件,所以要先引入Apache poi的依赖<dependency>
- 如何保持数据库中原有格式不变:这些问题在论坛里面几乎天天有人问~!其实当在输入信息,然后提交信息的时候,所有内容的格式是没有变的。只是在当提
- 本文实例讲述了Python3通过Luhn算法快速验证信用卡卡号的方法。分享给大家供大家参考。具体分析如下:Python3通过Luhn算法快速
- 1、说明当函数/方法执行出现异常,会将异常传递给函数/方法的调用一方。如果传递到主程序,仍然没有异常处理,程序才会被终止。2、实例def d
- 一. 静态资源static文件放在app中确认django.contrib.staticfiles包含在INSTALLED_APPS中。在s
- 自己写的一款基于bootstrap风格的弹框插件,暂时只有确认框、提示框。后续功能扩展、bug修改再更新。;(function($){ //
- 在训练循环中,定期调用 saver.save() 方法,向文件夹中写入包含了当前模型中所有可训练变量的 checkpoint 文件。save
- 众所周知,OpenStack的通信方式有两种,一种是基于HTTP协议的RESTFul API方式,另一种则是RPC调用。两种通信方式的应用场
- 问题:连续或者单个窗体,如何打印当前显示的记录?当前窗体还有对应的子窗体,也要一起打印出来我在一个窗体里有一个单号,大子窗体里有几组数据,我
- //重新封装document对象 var Console={ Write:function(msg){alert(msg);} }; //P
- Java读取数据库表package com.easycrud.builder;import com.easycrud.utils.Prope
- 从我们论坛中收集了这段HTML制作页面需要最大化、最小化时可以借鉴参考。最大化效果:<OBJECT id="max
- 原文地址:30 Days of Mootools 1.2 Tutorials - Day 11 - Using Fx.Morph, Fx O
- 一、简介我们来看看对 Vuex 比较专业的介绍:Vuex 是一个专为 Vue 开发的应用程序的状态管理模式,它采用集中式存储管理应用的所有组
- 介绍Matplotlib是Python中使用最广泛的数据可视化库之一。无论是简单还是复杂的可视化项目,它都是大多数人的首选库。在本教程中,我
- 异常可以防止出现一些不友好的信息返回给用户,有助于提升程序的可用性,在java中通过try ... catch ... finally来处理
- def sa_obj_to_dict(obj, filtrate=None, rename=None):
- 这次,我们用Turtle模块结合三角函数,绘制出这样的勾股树:首先,导入模块from turtle import *from math im
- 不需要依赖第三方组件的vue日期移动端组件 小轮子 轻量可复用: https://github.com/