Python使用APScheduler实现定时任务过程解析


Posted in Python onSeptember 11, 2019

前言

APScheduler是基于Quartz的一个Python定时任务框架。提供了基于日期、固定时间间隔以及crontab类型的任务,并且可以持久化任务。

在线文档:https://apscheduler.readthedocs.io/en/latest/userguide.html

一、安装APScheduler

pip install apscheduler

二、基本概念

APScheduler有四大组件:

1、触发器 triggers :
触发器包含调度逻辑。每个作业都有自己的触发器,用于确定下一个任务何时运行。除了初始配置之外,触发器是完全无状态的。

有三种内建的trigger:

  • (1)date: 特定的时间点触发
  • (2)interval: 固定时间间隔触发
  • (3)cron: 在特定时间周期性地触发

2、任务储存器 job stores:用于存放任务,把任务存放在内存(为默认MemoryJobStore)或数据库中。

3、执行器 executors: 执行器是将任务提交到线程池或进程池中运行,当任务完成时,执行器通知调度器触发相应的事件。

4、调度器 schedulers: 把上方三个组件作为参数,通过创建调度器实例来运行

根据开发需求选择相应的组件,下面是不同的调度器组件:

  • BlockingScheduler 阻塞式调度器:适用于只跑调度器的程序。
  • BackgroundScheduler 后台调度器:适用于非阻塞的情况,调度器会在后台独立运行。
  • AsyncIOScheduler AsyncIO调度器,适用于应用使用AsnycIO的情况。
  • GeventScheduler Gevent调度器,适用于应用通过Gevent的情况。
  • TornadoScheduler Tornado调度器,适用于构建Tornado应用。
  • TwistedScheduler Twisted调度器,适用于构建Twisted应用。
  • QtScheduler Qt调度器,适用于构建Qt应用。

三、使用步骤

1、新建一个调度器schedulers

2、添加调度任务

3、运行调度任务

四、使用实例

1、触发器date

特定的时间点触发,只执行一次。参数如下:

参数 说明
run_date (datetime 或 str) 作业的运行日期或时间
timezone (datetime.tzinfo 或 str) 指定时区

使用例子:

from datetime import datetime
from datetime import date
from apscheduler.schedulers.blocking import BlockingScheduler
def job(text): 
 print(text)
scheduler = BlockingScheduler()
# 在 2019-8-30 运行一次 job 方法
scheduler.add_job(job, 'date', run_date=date(2019, 8, 30), args=['text1'])
# 在 2019-8-30 01:00:00 运行一次 job 方法
scheduler.add_job(job, 'date', run_date=datetime(2019, 8, 30, 1, 0, 0), args=['text2'])
# 在 2019-8-30 01:00:01 运行一次 job 方法
scheduler.add_job(job, 'date', run_date='2019-8-30 01:00:00', args=['text3'])
scheduler.start()

2、触发器interval

固定时间间隔触发。参数如下:

参数 说明
weeks (int) 间隔几周
days (int) 间隔几天
hours (int) 间隔几小时
minutes (int) 间隔几分钟
seconds (int) 间隔多少秒
start_date (datetime 或 str) 开始日期
end_date (datetime 或 str) 结束日期
timezone (datetime.tzinfo 或str)  

使用例子:

import time
from apscheduler.schedulers.blocking import BlockingScheduler
def job(text):  
  t = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))
  print('{} --- {}'.format(text, t))
scheduler = BlockingScheduler()
# 每隔 1分钟 运行一次 job 方法
scheduler.add_job(job, 'interval', minutes=1, args=['job1'])
# 在 2019-08-29 22:15:00至2019-08-29 22:17:00期间,每隔1分30秒 运行一次 job 方法
scheduler.add_job(job, 'interval', minutes=1, seconds = 30, start_date='2019-08-29 22:15:00', end_date='2019-08-29 22:17:00', args=['job2'])
scheduler.start()
'''
运行结果:
job2 --- 2019-08-29 22:15:00
job1 --- 2019-08-29 22:15:46
job2 --- 2019-08-29 22:16:30
job1 --- 2019-08-29 22:16:46
job1 --- 2019-08-29 22:17:46
...余下省略...
'''

3、触发器cron

在特定时间周期性地触发。参数如下:

参数 说明
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) 指定时区

这些参数支持算数表达式,取值格式有如下:

Python使用APScheduler实现定时任务过程解析

使用例子:

import time
from apscheduler.schedulers.blocking import BlockingScheduler
def 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'])
scheduler.start()
'''
运行结果:
job1 --- 2019-08-29 22:25:00
job2 --- 2019-08-29 22:25:00
job1 --- 2019-08-29 22:26:00
job1 --- 2019-08-29 22:27:00
...余下省略...
'''

4、通过装饰器scheduled_job()添加方法

添加任务的方法有两种:

(1)通过调用add_job()---见上面1至3代码

(2)通过装饰器scheduled_job():

第一种方法是最常用的方法。第二种方法主要是方便地声明在应用程序运行时不会更改的任务。该 add_job()方法返回一个apscheduler.job.Job实例,可以使用该实例稍后修改或删除该任务。

import time
from apscheduler.schedulers.blocking import BlockingScheduler
scheduler = BlockingScheduler()
@scheduler.scheduled_job('interval', seconds=5)
def job1(): 
 t = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))
 print('job1 --- {}'.format(t))
@scheduler.scheduled_job('cron', second='*/7')
def job2(): 
 t = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))
 print('job2 --- {}'.format(t))
scheduler.start()
'''
运行结果:
job2 --- 2019-08-29 22:36:35
job1 --- 2019-08-29 22:36:37
job2 --- 2019-08-29 22:36:42
job1 --- 2019-08-29 22:36:42
job1 --- 2019-08-29 22:36:47
job2 --- 2019-08-29 22:36:49
...余下省略...
'''

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python查看多台服务器进程的脚本分享
Jun 11 Python
Python使用matplotlib绘制动画的方法
May 20 Python
Python遍历文件夹和读写文件的实现代码
Aug 28 Python
python用reduce和map把字符串转为数字的方法
Dec 19 Python
对pandas中apply函数的用法详解
Apr 10 Python
在Pycharm中将pyinstaller加入External Tools的方法
Jan 16 Python
python调试神器PySnooper的使用
Jul 03 Python
基于多进程中APScheduler重复运行的解决方法
Jul 22 Python
如何使用repr调试python程序
Feb 28 Python
python sklearn包——混淆矩阵、分类报告等自动生成方式
Feb 28 Python
Python torch.flatten()函数案例详解
Aug 30 Python
python多线程方法详解
Jan 18 Python
基于Python实现剪切板实时监控方法解析
Sep 11 #Python
python连接、操作mongodb数据库的方法实例详解
Sep 11 #Python
面向对象学习之pygame坦克大战
Sep 11 #Python
Python整数与Numpy数据溢出问题解决
Sep 11 #Python
python中通过selenium简单操作及元素定位知识点总结
Sep 10 #Python
用Python画一个LinkinPark的logo代码实例
Sep 10 #Python
Pytorch修改ResNet模型全连接层进行直接训练实例
Sep 10 #Python
You might like
PHP 中dirname(_file_)讲解
2007/03/18 PHP
坏狼的PHP学习教程之第2天
2008/06/15 PHP
phpmyadmin里面导入sql语句格式的大量数据的方法
2010/06/05 PHP
php INI配置文件的解析实现分析
2011/01/04 PHP
php中用数组的方法设置cookies
2011/04/21 PHP
PHP通过正则表达式下载图片到本地的实现代码
2011/09/19 PHP
自定义php类(查找/修改)xml文档
2013/03/26 PHP
php上传文件,创建递归目录的实例代码
2013/10/18 PHP
PHP不用递归遍历目录下所有文件的代码
2014/07/04 PHP
Extjs NumberField后面加单位实现思路
2013/07/30 Javascript
控制文字内容的显示与隐藏示例
2014/06/11 Javascript
详解JavaScript中的blink()方法的使用
2015/06/08 Javascript
jQuery实现漂亮实用的商品图片tips提示框效果(无图片箭头+阴影)
2016/04/16 Javascript
Angularjs CURD 详解及实例代码
2016/09/14 Javascript
Node.js的文件权限及读写flag详解
2016/10/11 Javascript
微信小程序 封装http请求实例详解
2017/01/16 Javascript
vue服务端渲染的实例代码
2017/08/28 Javascript
Vue 父子组件的数据传递、修改和更新方法
2018/03/01 Javascript
Vue+webpack+Element 兼容问题总结(小结)
2018/08/16 Javascript
[20:39]DOTA2-DPC中国联赛 正赛开幕式 1月18日
2021/03/11 DOTA
Python OS模块常用函数说明
2015/05/23 Python
pymysql之cur.fetchall() 和cur.fetchone()用法详解
2020/05/15 Python
python Xpath语法的使用
2020/11/26 Python
捷克家电和家具购物网站:OKAY.cz
2020/07/23 全球购物
平面设计师工作职责范文
2013/12/03 职场文书
应届毕业生应聘自荐信
2013/12/07 职场文书
茶叶生产计划书
2014/01/10 职场文书
美容院店长岗位职责
2014/04/08 职场文书
生日庆典策划方案
2014/06/02 职场文书
酒店采购员岗位职责
2015/04/03 职场文书
走进毛泽东观后感
2015/06/04 职场文书
《秋天的图画》教学反思
2016/02/19 职场文书
让文件路径提取变得更简单的Python Path库
2021/05/27 Python
MySQL 全文检索的使用示例
2021/06/07 MySQL
vue 数字翻牌器动态加载数据
2022/04/20 Vue.js
纯CSS打字动画的实现示例
2022/08/05 HTML / CSS