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中List.index()方法的使用教程
May 20 Python
Python冒泡排序注意要点实例详解
Sep 09 Python
基于python中staticmethod和classmethod的区别(详解)
Oct 24 Python
python发送邮件脚本
May 22 Python
将python图片转为二进制文本的实例
Jan 24 Python
Python OpenCV 调用摄像头并截图保存功能的实现代码
Jul 02 Python
Python实现Selenium自动化Page模式
Jul 14 Python
Python如何使用k-means方法将列表中相似的句子归类
Aug 08 Python
基于python SMTP实现自动发送邮件教程解析
Jun 02 Python
keras-siamese用自己的数据集实现详解
Jun 10 Python
基于Python制作一副扑克牌过程详解
Oct 19 Python
python实现测试工具(二)——简单的ui测试工具
Oct 19 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
mysql时区问题
2008/03/26 PHP
PHP iconv 函数转gb2312的bug解决方法
2009/10/11 PHP
php小经验:解析preg_match与preg_match_all 函数
2013/06/29 PHP
[原创]smarty简单模板变量输出方法
2016/07/09 PHP
PHP CodeIgniter分页实例及多条件查询解决方案(推荐)
2017/05/20 PHP
List Installed Hot Fixes
2007/06/12 Javascript
javascript 动态参数判空操作
2008/12/22 Javascript
JavaScript深度复制(deep clone)的实现方法
2016/02/19 Javascript
KnockoutJS 3.X API 第四章之数据控制流with绑定
2016/10/10 Javascript
JavaScript获取服务器端时间的方法
2016/11/29 Javascript
微信小程序 radio单选框组件详解及实例代码
2017/01/10 Javascript
从零学习node.js之文件操作(三)
2017/02/21 Javascript
jquery实现图片上传前本地预览
2017/04/28 jQuery
Angularjs 与 bower安装和使用详解
2017/05/11 Javascript
vue.js国际化 vue-i18n插件的使用详解
2017/07/07 Javascript
jquery select插件异步实时搜索实例代码
2017/10/20 jQuery
vue使用element-ui的el-input监听不了回车事件的解决方法
2018/01/12 Javascript
浅谈Angular6的服务和依赖注入
2018/06/27 Javascript
利用Angular2的Observables实现交互控制的方法
2018/12/27 Javascript
Python和GO语言实现的消息摘要算法示例
2015/03/10 Python
在Django中编写模版节点及注册标签的方法
2015/07/20 Python
解决python文件双击运行秒退的问题
2019/06/24 Python
解决pycharm remote deployment 配置的问题
2019/06/27 Python
Python flask框架post接口调用示例
2019/07/03 Python
Python中的Cookie模块如何使用
2020/06/04 Python
pytorch使用horovod多gpu训练的实现
2020/09/09 Python
python中pdb模块实例用法
2021/01/15 Python
Python实现图片指定位置加图片水印(附Pyinstaller打包exe)
2021/03/04 Python
bonprix荷兰网上商店:便宜的服装、鞋子和家居用品
2020/07/04 全球购物
党员反对四风问题思想汇报
2014/09/12 职场文书
破坏寝室公物检讨书
2014/11/17 职场文书
电影地道战观后感
2015/06/04 职场文书
学习经验交流会演讲稿
2015/11/02 职场文书
Python 线程池模块之多线程操作代码
2021/05/20 Python
解决pycharm安装scrapy DLL load failed:找不到指定的程序的问题
2021/06/08 Python
浅谈resultMap的用法及关联结果集映射
2021/06/30 Java/Android