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 相关文章推荐
django实现分页的方法
May 26 Python
python对象及面向对象技术详解
Jul 19 Python
Python在图片中添加文字的两种方法
Apr 29 Python
Django框架模板注入操作示例【变量传递到模板】
Dec 19 Python
Python提取转移文件夹内所有.jpg文件并查看每一帧的方法
Jun 27 Python
Python Pandas 获取列匹配特定值的行的索引问题
Jul 01 Python
Python Django基础二之URL路由系统
Jul 18 Python
基于Python实现剪切板实时监控方法解析
Sep 11 Python
Django项目基础配置和基本使用过程解析
Nov 25 Python
Python PyInstaller安装和使用教程详解
Jan 08 Python
Tensorflow 定义变量,函数,数值计算等名字的更新方式
Feb 10 Python
python实现MD5进行文件去重的示例代码
Jul 09 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
不用iconv库的gb2312与utf-8的互换函数
2006/10/09 PHP
信用卡效验程序
2006/10/09 PHP
Laravel学习教程之本地化模块
2017/08/18 PHP
关于IE、Firefox、Opera页面呈现异同 写脚本很痛苦
2009/08/28 Javascript
Javascript中定义方法的另类写法(批量定义js对象的方法)
2011/02/25 Javascript
js 完美图片新闻轮转效果,腾讯大粤网首页图片轮转改造而来
2011/11/21 Javascript
使用jQuery中的when实现多个AJAX请求对应单个回调的例子分享
2014/04/23 Javascript
jquery使用正则表达式验证email地址的方法
2015/01/22 Javascript
jQuery遍历页面所有CheckBox查看是否被选中的方法
2015/04/14 Javascript
jQuery实现动态添加和删除一个div
2015/08/12 Javascript
Javascript实现快速排序(Quicksort)的算法详解
2015/09/06 Javascript
JavaScript判断页面加载完之后再执行预定函数的技巧
2016/05/17 Javascript
jquery div模态窗口的简单实例
2016/05/28 Javascript
JS控件bootstrap suggest plugin使用方法详解
2017/03/25 Javascript
jquery实现放大镜简洁代码(推荐)
2017/06/08 jQuery
JS实现unicode和UTF-8之间的互相转换互转
2017/07/05 Javascript
基于JavaScript实现无限加载瀑布流
2017/07/21 Javascript
Vue Router 实现动态路由和常见问题及解决方法
2020/03/06 Javascript
nuxt 自定义 auth 中间件实现令牌的持久化操作
2020/11/05 Javascript
在Python的Flask框架中实现全文搜索功能
2015/04/20 Python
在Django中编写模版节点及注册标签的方法
2015/07/20 Python
Django如何配置mysql数据库
2018/05/04 Python
解决pycharm启动后总是不停的updating indices...indexing的问题
2019/11/27 Python
python绘制分布折线图的示例
2020/09/24 Python
关于PyCharm安装后修改路径名称使其可重新打开的问题
2020/10/20 Python
澳大利亚家具和家居用品在线商店:Interiors Online
2018/03/05 全球购物
中国旅游网站:途牛旅游网
2019/09/29 全球购物
2013年办公室秘书的个人自我鉴定
2013/10/24 职场文书
银行营业厅大堂经理岗位职责
2014/01/06 职场文书
自荐书范文范例
2014/02/13 职场文书
2014年学校法制宣传日活动总结
2014/11/01 职场文书
2014年机关工会工作总结
2014/12/19 职场文书
2015年监理个人工作总结
2015/05/23 职场文书
岁月神偷观后感
2015/06/11 职场文书
七年级作文之雪景
2019/11/18 职场文书
使用Docker容器部署rocketmq单机的全过程
2022/04/03 Servers