Python APScheduler 定时任务详解
目录
- 一、基本概念
- 1.1、 触发器:triggers
- 1.2、作业存储器:job stores
- 1.3、执行器 executors
- 1.4、调度器 schedulers
- 二、调度器详解
- 2.1、APScheduler有三种内置的触发器
- 2.2、触发器公共参数
- 2.3、date内置触发器
- 2.4、interval 周期触发任务
- 2.5、cron 触发器 在特定时间周期性地触发,和Linux crontab格式兼容。它是功能最强大的触发器
一、基本概念
APScheduler
全称Advanced Python Scheduler
作用为在指定的时间规则执行指定的作业。
- 指定时间规则的方式可以是间隔多久执行,可以是指定日期时间的执行,也可以类似Linux系统中Crontab中的方式执行任务。
- 指定的任务就是一个Python函数。
1.1、 触发器:triggers
用于设定触发任务的条件:
触发器包含调度逻辑。每个任务都有自己的触发器,用于确定何时应该运行作业。除了初始配置之外,触发器完全是无状态的
1.2、作业存储器:job stores
用于存放任务,把任务存放在内存或数据库中
- 默认情况下,任务存放在内存中。也可以配置存放在不同类型的数据库中。如果任务存放在数据库中,那么任务的存取有一个序列化和反序列化的过程,同时修改和搜索任务的功能也是由任务储存器实现。
- 注意一个任务储存器不要共享给多个调度器,否则会导致状态混乱
1.3、执行器 executors
用于执行任务,可以设定执行模式为单线程或线程池:
任务会被执行器放入线程池或进程池去执行,执行完毕后,执行器会通知调度器。
1.4、调度器 schedulers
把上方三个组件作为参数,通过创建调度器实例来运行:
一个调度器由上方三个组件构成,一般来说,一个程序只要有一个调度器就可以了。开发者也不必直接操作任务储存器、执行器以及触发器,因为调度器提供了统一的接口,通过调度器就可以操作组件,比如任务的增删改查。
二、调度器详解
BlockingScheduler
: 阻塞式调度器:适用于只跑调度器的程序。BackgroundScheduler
: 后台调度器:适用于非阻塞的情况,调度器会在后台独立运行AsyncIOScheduler
: AsyncIO调度器,适用于应用使用AsnycIO的情况。GeventScheduler
: Gevent调度器,适用于应用通过Gevent的情况。TornadoScheduler
: Tornado调度器,适用于构建Tornado应用。TwistedScheduler
:Twisted调度器,适用于构建Twisted应用。QtScheduler
: Qt调度器,适用于构建Qt应用。
2.1、APScheduler有三种内置的触发器
date
:日期:触发任务运行的具体日期interval
: 间隔:触发任务运行的时间间隔cron
: 周期:触发任务运行的周期
2.2、触发器公共参数
id
:启动任务的ID具有唯一性name
: 设置启动任务的名称coalesce
:当由于某种原因导致某个job积攒了好几次没有实际运行(比如说系统挂了5分钟后恢复,有一个任务是每分钟跑一次的,按道理说这5分钟内本来是“计划”运行5次的,但实际没有执行),如果coalesce为True,下次这个job被submit给executor时,只会执行1次,也就是最后这次,如果为False,那么会执行5次(不一定,因为还有其他条件,看后面misfire_grace_time的解释)max_instance
: 就是说同一个job同一时间最多有几个实例再跑,比如一个耗时10分钟的job,被指定每分钟运行1次,如果我们max_instance值为5,那么在第6~10分钟上,新的运行实例不会被执行,因为已经有5个实例在跑了misfire_grace_time
:设想和上述coalesce类似的场景,如果一个job本来14:00有一次执行,但是由于某种原因没有被调度上,现在14:01了,这个14:00的运行实例被提交时,会检查它预订运行的时间和当下时间的差值(这里是1分钟),大于我们设置的30秒限制,那么这个运行实例不会被执行。replace_existing
: 如果调度的job在一个持久化的存储器里,当初始化应用程序时,必须要为job定义一个显示的ID并使用replace_existing=True
, 否则每次应用程序重启时都会得到那个job的一个新副本
2.3、date内置触发器
date 是最基本的一种调度,作业任务只会执行一次。它表示特定的时间点触发。它的参数如下:
参数 | 说明 |
---|---|
run_date (datetime 或 str) | 作业的运行日期或时间 |
timezone (datetime.tzinfo 或 str) | 指定时区 |
from datetime import datetime
from datetime import date
from apscheduler.schedulers.blocking import BlockingSchedulerdef job(text):print(text)scheduler = BlockingScheduler()
# 在 2019-8-30 运行一次 job 方法
scheduler.add_job(job, 'date', run_date=date(2022, 4, 9), args=['text1'], id="1", coalesce=True, max_instances=1)
# 在 2019-8-30 01:00:00 运行一次 job 方法
scheduler.add_job(job, 'date', run_date=datetime(2022, 4, 9, 17, 40, 58), args=['text2'], id="2", coalesce=True, max_instances=1)
# 在 2019-8-30 01:00:01 运行一次 job 方法
scheduler.add_job(job, 'date', run_date='2022-4-9 17:41:00', args=['text3'], id="3", coalesce=True, max_instances=1)scheduler.start()
2.4、interval 周期触发任务
参数 | 说明 |
---|---|
weeks (int)
|
间隔几周 |
days (int)
|
间隔几天 |
hours (int)
|
间隔几小时 |
minutes (int)
|
间隔几分钟 |
seconds (int)
|
间隔多少秒 |
start_date (datetime 或 str)
|
开始日期 |
end_date (datetime 或 str)
|
结束日期 |
timezone (datetime.tzinfo 或str)
|
时区 |
@sched.scheduled_job("interval", id=spider_job_name + "_bg_data", coalesce=True, max_instances=1, minutes=20
)
def tick_rzjg_detail_xq():"""快速完成:return:"""each = "rzjg_bg_data"cmd_str = f"cd {ROOT} && bash run_spider.sh {each} --loglevel=INFO"print(cmd_str)os.system(cmd_str)
def func():print("Press Ctrl+C to exit")# 直接触发一次tick_rzjg_detail_xq()try:sched.start()except (KeyboardInterrupt, SystemExit):passif __name__ == "__main__":func()
2.5、cron 触发器 在特定时间周期性地触发,和Linux crontab格式兼容。它是功能最强大的触发器
参数 | 说明 |
---|---|
year (int 或 str)
|
年,4位数字 |
month (int 或 str)
|
月 (范围1-12) |
day (int 或 str)
|
日 (范围1-31) |
week (int 或 str)
|
周 (范围1-53) |
day_of_week (int 或 str)
|
周内第几天或者星期几 (范围0-6 或者 mon,tue,wed,thu,fri,sat,sun) |
hour (int 或 str)
|
时 (范围0-23) |
minute (int 或 str)
|
分 (范围0-59) |
second (int 或 str)
|
秒 (范围0-59) |
start_date (datetime 或 str)
|
最早开始日期(包含) |
end_date (datetime 或 str)
|
最晚结束时间(包含) |
timezone (datetime.tzinfo 或str)
|
指定时区 |
表达式 | 参数类型 | 描述 |
---|---|---|
* | 所有 | 通配符。例:minutes=*即每分钟触发 |
*/a | 所有 | 可被a整除的通配符 |
a-b | 所有 | 范围a-b触发 |
a-b/c | 所有 | 范围a-b,且可被c整除时触发 |
xth y | 日 | 第几个星期几触发。x为第几个,y为星期几 |
last x | 日 | 一个月中,最后个星期几触发 |
last | 日 | 一个月最后一天触发 |
x,y,z | 所有 | 组合表达式,可以组合确定值或上方的表达式 |
import timefrom apscheduler.schedulers.blocking import BlockingSchedulerdef job(text):t = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))print('{} --- {}'.format(text, t))scheduler = BlockingScheduler()# 在每天22点,每隔 1分钟 运行一次 job 方法scheduler.add_job(job, 'cron', hour=22, minute='*/1', args=['job1'])# 在每天22和23点的25分,运行一次 job 方法scheduler.add_job(job, 'cron', hour='22-23', minute='25', args=['job2'])# 在每天 8 点,运行一次 job 方法scheduler.add_job(job, 'cron', hour='8', args=['job2'])# 在每天 8 点 20点,各运行一次 job 方法 设置最大运行实例数scheduler.add_job(job, 'cron', hour='8, 20', minute=30, max_instances=4)scheduler.start()
Python APScheduler 定时任务详解相关推荐
- 定时任务框架APScheduler学习详解
定时任务框架APScheduler学习详解 APScheduler简介 在平常的工作中几乎有一半的功能模块都需要定时任务来推动,例如项目中有一个定时统计程序,定时爬出网站的URL程序,定时检测钓鱼网站 ...
- python20191031_20191031:Python取反运算详解
20191031:Python取反运算详解 取反运算:~3 == 4 1.对于数字 3 =======>转换为二进制表示为011 2.对011取反为100 3.为什么表示-4 a.计算机用补码表 ...
- Python字符编码详解
Python字符编码详解 转自http://www.cnblogs.com/huxi/archive/2010/12/05/1897271.html Python字符编码详解 本文简单介绍了各种常用的 ...
- python的执行过程_在交互式环境中执行Python程序过程详解
前言 相信接触过Python的伙伴们都知道运行Python脚本程序的方式有多种,目前主要的方式有:交互式环境运行.命令行窗口运行.开发工具上运行等,其中在不同的操作平台上还互不相同.今天,小编讲些Py ...
- windows上安装Anaconda和python的教程详解
一提到数字图像处理编程,可能大多数人就会想到matlab,但matlab也有自身的缺点: 1.不开源,价格贵 2.软件容量大.一般3G以上,高版本甚至达5G以上. 3.只能做研究,不易转化成软件. 因 ...
- python变量类型-Python 变量类型详解
变量存储在内存中的值.这就意味着在创建变量时会在内存中开辟一个空间. 基于变量的数据类型,解释器会分配指定内存,并决定什么数据可以被存储在内存中. 因此,变量可以指定不同的数据类型,这些变量可以存储整 ...
- python安装教程windows-windows上安装Anaconda和python的教程详解
一提到数字图像处理编程,可能大多数人就会想到matlab,但matlab也有自身的缺点: 1.不开源,价格贵 2.软件容量大.一般3G以上,高版本甚至达5G以上. 3.只能做研究,不易转化成软件. 因 ...
- python语言编程基础-Python语言入门详解!快速学成Python!
原标题:Python语言入门详解!快速学成Python! 很多技能是被职场所需要的,但很可惜... 这些技能在大学中并学习不到. 大学和职场现实存在的横沟对大部分同学来说难以跨越或碰得头破血流... ...
- Python 字符串方法详解
Python 字符串方法详解 本文最初发表于赖勇浩(恋花蝶)的博客(http://blog.csdn.net/lanphaday),如蒙转载,敬请保留全文完整,切勿去除本声明和作者信息. 在编程中,几 ...
最新文章
- 线性回归之正则化线性模型
- 【剑指offer-Java版】34丑数
- 122网络各层中的设备是什么以及工作原理
- Java大神推荐,java编程基础必备(必看)
- @Autowired注解警告Field injection is not recommended
- esp32摄像显示时间_科普系列 || 第一弹~基于ESP32的WiFi连接
- Python破解滑块验证码算法,完美避开人机识别
- 通过多组的HSRP实现网络的冗余和负载
- android 安卓 pc 电脑 通讯,安卓利用Socket和PC通信无法连接?
- oracle查询属主下对象,SQL优化
- NYOJ455 - 黑色帽子
- 错过了多次捞钱的机会
- iOS codeview
- 2.11.PHP7.1 狐教程-【PHP 数组】
- 微信僵尸粉删除工具 WeTool v4.0.7.0 免费版
- 构筑城市生命线:应急管理需要新思路,全域能力成关键
- vue图片压缩不失真_vue中实现图片压缩 file文件的方法
- 量子物理 詹班 计算机,连爱因斯坦都被困其中,量子力学到底有多厉害?
- 2021年软考考核方式
- C++设计模式(1)——设计模式简介