测试开发技术网站
博客
设计
设计
开发
Python
测试
unittest
运维
Linux基础应用
CI/CD
CI/CD
数据库
数据库
云计算
云计算
云原生
云原生
爬虫
爬虫
数据分析
数据分析
人工智能
人工智能
登录
注册
Python----使用apscheduler模块设置定时任务
收藏本文
作者:redrose2100 类别: 日期:2022-05-25 06:35:06 阅读:1369 次 消耗积分:0 分
## 一、安装 ```bash pip install apscheduler ``` ## 二、ApScheduler 简介 ### 1 APScheduler的组件 * triggers:触发器 triggers包含任务执行的调度逻辑,决定任务按照什么逻辑进行定时执行 * job stores;任务存储器 存储了调度任务 * executors:执行器 用例执行任务的,包含线程池以及进程池等的创建和调用等等 * schedulers:调度器 属于控制面,将其他几个方面组织起来的作用、 ### 2 调度器的种类 调度器有以下几种常见类型,其中最常用的BackgroundScheduler,即非阻塞式,因为在一般情况下,定时任务都会在放到web服务中,如果使用阻塞式,则无法启动web服务,而使用非阻塞式,则将定时任务设定后,就不管了,继续执行后面的web服务,只要web服务在运行,定时任务就是一直有效的 * BlockingScheduler: 阻塞式 * BackgroundScheduler: 非阻塞式(后台运行) * AsyncIOScheduler: 当使用asyncio模块时使用 * GeventScheduler: 当使用gevent模块时使用 * TornadoScheduler: 构建Tornado应用时使用 * TwistedScheduler: 构建Twisted应用时使用 * QtScheduler: 构建Qt应用时使用 ### 3 内置的触发器类型 * date: 在某个时间点执行一次时使用 * interval: 固定的时间间隔循环执行时使用 * cron: 在一天中特定的时间点执行时使用 * calendarinterval: 当想在在一天中特定时间点或以日历为基础的时间间隔内执行时使用 ## 三、使用举例 这里jiu就以非阻塞式BackgroundScheduler调度器为例展开 ### 1 使用date类型的触发器 如下,使用了三种设置日期和时间的方法 ```python from apscheduler.schedulers.background import BackgroundScheduler import time from datetime import date from datetime import datetime def do_func(name,age): print(time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time()))+" in do func : 姓名:"+name+" 年龄:"+str(age)) def main(): print(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))) sched=BackgroundScheduler() # 通过date 设置指定日期执行 sched.add_job(do_func,trigger="date",run_date=date(2022,5,25),args=("张三丰",100)) # 通过datetime,设置指定日期额指定时刻执行 sched.add_job(do_func, trigger="date", run_date=datetime(2022, 5, 25,14,0,10), args=("张三丰", 100)) # 直接使用文本的方式指定日期和时刻表 sched.add_job(do_func, trigger="date", run_date="2022-05-25 14:0:20", args=("张三丰", 100)) sched.start() if __name__=="__main__": main() while True: print(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))) time.sleep(1) ``` 执行结果如下,可以发现,第一个通过date指定日期的默认是0点执行,显然时间已经过了,不会执行,第二和第三个则在规定的时间点执行了,这里还需要注意的是,通过打印可以看出,main函数执行完成后,已经开始执行main函数下面的while循环打印语句了,而在执行循环的过程中,定时任务仍然生效,这就是非阻塞式调度器的原理,如果是阻塞式,则在此代码中,会一直卡在main函数中,main下面额while循环语句是不会执行的,因此在实际使用中,非阻塞式应用的是非常多的 ```bash 2022-05-25 14:00:02 2022-05-25 14:00:02 C:\Users\hitre\.virtualenvs\zentaolinkgitlab-QCS5yxD9\lib\site-packages\apscheduler\util.py:436: PytzUsageWarning: The localize method is no longer necessary, as this time zone supports the fold attribute (PEP 495). For more details on migrating to a PEP 495-compliant implementation, see https://pytz-deprecation-shim.readthedocs.io/en/latest/migration.html return tzinfo.localize(dt) Run time of job "do_func (trigger: date[2022-05-25 00:00:00 CST], next run at: 2022-05-25 00:00:00 CST)" was missed by 14:00:02.088260 2022-05-25 14:00:03 2022-05-25 14:00:04 2022-05-25 14:00:05 2022-05-25 14:00:06 2022-05-25 14:00:07 2022-05-25 14:00:08 2022-05-25 14:00:09 2022-05-25 14:00:10 in do func : 姓名:张三丰 年龄:100 2022-05-25 14:00:10 2022-05-25 14:00:11 2022-05-25 14:00:12 2022-05-25 14:00:13 2022-05-25 14:00:14 2022-05-25 14:00:15 2022-05-25 14:00:16 2022-05-25 14:00:17 2022-05-25 14:00:18 2022-05-25 14:00:19 2022-05-25 14:00:20 in do func : 姓名:张三丰 年龄:100 2022-05-25 14:00:20 2022-05-25 14:00:21 2022-05-25 14:00:22 ``` ### 2 使用interval类型的触发器 如下代码演示了时间间隔循环执行的使用例子 ```pyhton from apscheduler.schedulers.background import BackgroundScheduler import time from datetime import date from datetime import datetime def do_func(name,age): print(time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time()))+" in do func : 姓名:"+name+" 年龄:"+str(age)) def main(): print(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))) sched=BackgroundScheduler() # 每3秒执行一次 sched.add_job(do_func,trigger="interval",args=("张三丰",100),seconds=3) # 每3分钟执行一次 sched.add_job(do_func, trigger="interval", args=("张三丰", 100), minutes=3) # 每3小时执行一次 sched.add_job(do_func, trigger="interval", args=("张三丰", 100), hours=3) # 每3天执行一次 sched.add_job(do_func, trigger="interval", args=("张三丰", 100), days=3) # 每3周执行一次 sched.add_job(do_func, trigger="interval", args=("张三丰", 100), weeks=3) sched.start() if __name__=="__main__": main() while True: print(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))) time.sleep(1) ``` 上面的代码中因为时间跨度比较大,这里只演示妹3秒执行一次的代码 代码如下: ```python from apscheduler.schedulers.background import BackgroundScheduler import time from datetime import date from datetime import datetime def do_func(name,age): print(time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time()))+" in do func : 姓名:"+name+" 年龄:"+str(age)) def main(): print(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))) sched=BackgroundScheduler() # 每3秒执行一次 sched.add_job(do_func,trigger="interval",args=("张三丰",100),seconds=3) sched.start() if __name__=="__main__": main() while True: print(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))) time.sleep(1) ``` 执行结果如下: ```bash 2022-05-25 14:14:04 2022-05-25 14:14:04 2022-05-25 14:14:05 2022-05-25 14:14:06 2022-05-25 14:14:07 in do func : 姓名:张三丰 年龄:100 2022-05-25 14:14:07 2022-05-25 14:14:08 2022-05-25 14:14:09 2022-05-25 14:14:10 in do func : 姓名:张三丰 年龄:100 2022-05-25 14:14:10 2022-05-25 14:14:11 2022-05-25 14:14:12 2022-05-25 14:14:13 in do func : 姓名:张三丰 年龄:100 2022-05-25 14:14:13 ``` ### 3 使用cron类型的触发器 cron的触发器有点类似linux上crontab定时器的使用,代码如下: ```python from apscheduler.schedulers.background import BackgroundScheduler import time from datetime import date from datetime import datetime def do_func(name,age): print(time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time()))+" in do func : 姓名:"+name+" 年龄:"+str(age)) def main(): print(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))) sched=BackgroundScheduler() # 任务会在6月、7月、8月、11月和12月的第三个周五,00:00、01:00、02:00和03:00触发 sched.add_job(do_func,trigger="cron",month='6-8,11-12', day='3rd fri', hour='0-3',args=("张三丰",100)) sched.start() if __name__=="__main__": main() while True: print(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))) time.sleep(1) ``` 这里需要注意的是,可以省略不需要的字段。当省略时间参数时,在显式指定参数之前的参数会被设定为*,之后的参数会被设定为最小值,week 和day_of_week的最小值为* ```python day=1, minute=20 等同于 year='*', month='*', day=1, week='*', day_of_week='*', hour='*', minute=20, second=0 ``` 此外,也可以直接使用crontab表达式,如下: ```python from apscheduler.schedulers.background import BackgroundScheduler from apscheduler.triggers.cron import CronTrigger import time from datetime import date from datetime import datetime def do_func(name,age): print(time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time()))+" in do func : 姓名:"+name+" 年龄:"+str(age)) def main(): print(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))) sched=BackgroundScheduler() # 任务会在6月、7月、8月、11月和12月的第三个周五,00:00、01:00、02:00和03:00触发 sched.add_job(do_func,trigger=CronTrigger.from_crontab('48 10 1-15 sep-nov *'),args=("张三丰",100)) sched.start() if __name__=="__main__": main() while True: print(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))) time.sleep(1) ``` ## 四、定时器使用装饰器的方法 以间隔时间循环执行的代码为例,如下为未使用装饰器的方式 ```python from apscheduler.schedulers.background import BackgroundScheduler import time from datetime import date from datetime import datetime def do_func(name,age): print(time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time()))+" in do func : 姓名:"+name+" 年龄:"+str(age)) def main(): print(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))) sched=BackgroundScheduler() # 每3秒执行一次 sched.add_job(do_func,trigger="interval",args=("张三丰",100),seconds=3) sched.start() if __name__=="__main__": main() while True: print(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))) time.sleep(1) ``` 修改为使用装饰器的方式如下: ```python from apscheduler.schedulers.background import BackgroundScheduler import time sched=BackgroundScheduler() @sched.scheduled_job(trigger="interval",args=("张三丰",100),seconds=3) def do_func(name,age): print(time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time()))+" in do func : 姓名:"+name+" 年龄:"+str(age)) if __name__=="__main__": sched.start() while True: print(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))) time.sleep(1) ``` 执行结果如下: ```bash 2022-05-25 14:34:10 2022-05-25 14:34:11 2022-05-25 14:34:12 2022-05-25 14:34:13 in do func : 姓名:张三丰 年龄:100 2022-05-25 14:34:13 2022-05-25 14:34:14 2022-05-25 14:34:15 2022-05-25 14:34:16 in do func : 姓名:张三丰 年龄:100 2022-05-25 14:34:16 2022-05-25 14:34:17 2022-05-25 14:34:18 2022-05-25 14:34:19 in do func : 姓名:张三丰 年龄:100 2022-05-25 14:34:19 2022-05-25 14:34:20 ```
始终坚持开源开放共享精神,同时感谢您的充电鼓励和支持!
版权所有,转载本站文章请注明出处:redrose2100, http://blog.redrose2100.com/article/306
上一篇:
Python----schedule模块关于定时任务的高级用法二
下一篇:
MySQL----MySQL环境搭建即MySQL在Windows、Centos、Docker、Kubernetes环境下的安装部署
搜索
个人成就
出版书籍
《Pytest企业级应用实战》
测试开发技术全栈公众号
测试开发技术全栈公众号
DevOps技术交流微信群
加微信邀请进群
常用网站链接
开源软件洞察
云原生技术栈全景图
Python语言官方文档
Golang官方文档
Docker官方文档
Jenkins中文用户手册
Scrapy官方文档
VUE官方文档
Harbor官方文档
openQA官方文档
云原生开源社区
开源中国
Kubernetes中文文档
Markdown语法官方教程
Kubernetes中文社区
Kubersphere官方文档
BootStrap中文网站
JavaScript中文网
NumPy官方文档
Pandas官方文档
GitLink确实开源网站
数据库排名网站
编程语言排名网站
SEO综合查询网站
数学加减法练习自动生成网站
Kickstart Generator
文章分类
最新文章
最多阅读
特别推荐
×
Close
登录
注册
找回密码
登录邮箱:
登录密码:
图片验证码:
注册邮箱:
注册密码:
邮箱验证码:
发送邮件
注册邮箱:
新的密码:
邮箱验证码:
发送邮件