Python定时任务框架APScheduler原理及常用代码


Posted in Python onOctober 05, 2020

APScheduler简介

在平常的工作中几乎有一半的功能模块都需要定时任务来推动,例如项目中有一个定时统计程序,定时爬出网站的URL程序,定时检测钓鱼网站的程序等等,都涉及到了关于定时任务的问题,第一时间想到的是利用time模块的time.sleep()方法使程序休眠来达到定时任务的目的,虽然这样也可以,但是总觉得不是那么的专业,^_^所以就找到了python的定时任务模块APScheduler:

APScheduler基于Quartz的一个Python定时任务框架,实现了Quartz的所有功能,使用起来十分方便。提供了基于日期、固定时间间隔以及crontab类型的任务,并且可以持久化任务。基于这些功能,我们可以很方便的实现一个python定时任务系统。

安装

1、利用pip进行安装

$ pip install apscheduler

2、源码安装(https://pypi.python.org/pypi/APScheduler/)

$ python setup.py install

APScheduler有四种组成部分:

触发器(trigger)包含调度逻辑,每一个作业有它自己的触发器,用于决定接下来哪一个作业会运行。除了他们自己初始配置意外,触发器完全是无状态的。

作业存储(job store)存储被调度的作业,默认的作业存储是简单地把作业保存在内存中,其他的作业存储是将作业保存在数据库中。一个作业的数据讲在保存在持久化作业存储时被序列化,并在加载时被反序列化。调度器不能分享同一个作业存储。

执行器(executor)处理作业的运行,他们通常通过在作业中提交制定的可调用对象到一个线程或者进城池来进行。当作业完成时,执行器将会通知调度器。

调度器(scheduler)是其他的组成部分。你通常在应用只有一个调度器,应用的开发者通常不会直接处理作业存储、调度器和触发器,相反,调度器提供了处理这些的合适的接口。配置作业存储和执行器可以在调度器中完成,例如添加、修改和移除作业。 

简单应用:
import time
from apscheduler.schedulers.blocking import BlockingScheduler

def my_job():
print time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))

sched = BlockingScheduler()
sched.add_job(my_job, 'interval', seconds=5)
sched.start()
上面的例子表示每隔5s执行一次my_job函数,输出当前时间信息

操作作业

1. 添加作业

上面是通过add_job()来添加作业,另外还有一种方式是通过scheduled_job()修饰器来修饰函数

import time
from apscheduler.schedulers.blocking import BlockingScheduler

sched = BlockingScheduler()

@sched.scheduled_job('interval', seconds=5)
def my_job():
print time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))

sched.start()

2. 移除作业

job = scheduler.add_job(myfunc, 'interval', minutes=2)
job.remove()
#如果有多个任务序列的话可以给每个任务设置ID号,可以根据ID号选择清除对象,且remove放到start前才有效
sched.add_job(myfunc, 'interval', minutes=2, id='my_job_id')
sched.remove_job('my_job_id')

3. 暂停和恢复作业

暂停作业:

apsched.job.Job.pause()
apsched.schedulers.base.BaseScheduler.pause_job()

恢复作业:

apsched.job.Job.resume()
apsched.schedulers.base.BaseScheduler.resume_job()

4. 获得job列表

获得调度作业的列表,可以使用get_jobs()来完成,它会返回所有的job实例。或者使用print_jobs()来输出所有格式化的作业列表。也可以利用get_job(任务ID)获取指定任务的作业列表

job = sched.add_job(my_job, 'interval', seconds=2 ,id='123')
print sched.get_job(job_id='123')
print sched.get_jobs()

5. 关闭调度器

默认情况下调度器会等待所有正在运行的作业完成后,关闭所有的调度器和作业存储。如果你不想等待,可以将wait选项设置为False。

sched.shutdown()
sched.shutdown(wait=False)

作业运行的控制(trigger)

add_job的第二个参数是trigger,它管理着作业的调度方式。它可以为date, interval或者cron。对于不同的trigger,对应的参数也相同。

(1). cron定时调度(某一定时时刻执行)

(int|str) 表示参数既可以是int类型,也可以是str类型
(datetime | str) 表示参数既可以是datetime类型,也可以是str类型
year (int|str) ? 4-digit year -(表示四位数的年份,如2008年)
month (int|str) ? month (1-12) -(表示取值范围为1-12月)
day (int|str) ? day of the (1-31) -(表示取值范围为1-31日)
week (int|str) ? ISO week (1-53) -(格里历2006年12月31日可以写成2006年-W52-7(扩展形式)或2006W527(紧凑形式))
day_of_week (int|str) ? number or name of weekday (0-6 or mon,tue,wed,thu,fri,sat,sun) - (表示一周中的第几天,既可以用0-6表示也可以用其英语缩写表示)
hour (int|str) ? hour (0-23) - (表示取值范围为0-23时)
minute (int|str) ? minute (0-59) - (表示取值范围为0-59分)
second (int|str) ? second (0-59) - (表示取值范围为0-59秒)
start_date (datetime|str) ? earliest possible date/time to trigger on (inclusive) - (表示开始时间)
end_date (datetime|str) ? latest possible date/time to trigger on (inclusive) - (表示结束时间)
timezone (datetime.tzinfo|str) ? time zone to use for the date/time calculations (defaults to scheduler timezone) -(表示时区取值)

参数的取值格式:

Python定时任务框架APScheduler原理及常用代码

例子:

#表示2017年3月22日17时19分07秒执行该程序
sched.add_job(my_job, 'cron', year=2017,month = 03,day = 22,hour = 17,minute = 19,second = 07)
#表示任务在6,7,8,11,12月份的第三个星期五的00:00,01:00,02:00,03:00 执行该程序
sched.add_job(my_job, 'cron', month='6-8,11-12', day='3rd fri', hour='0-3')
#表示从星期一到星期五5:30(AM)直到2014-05-30 00:00:00
sched.add_job(my_job(), 'cron', day_of_week='mon-fri', hour=5, minute=30,end_date='2014-05-30')
#表示每5秒执行该程序一次,相当于interval 间隔调度中seconds = 5
sched.add_job(my_job, 'cron',second = '*/5')

(2). interval 间隔调度(每隔多久执行)

weeks (int) ? number of weeks to wait
days (int) ? number of days to wait
hours (int) ? number of hours to wait
minutes (int) ? number of minutes to wait
seconds (int) ? number of seconds to wait
start_date (datetime|str) ? starting point for the interval calculation
end_date (datetime|str) ? latest possible date/time to trigger on
timezone (datetime.tzinfo|str) ? time zone to use for the date/time calculations

例子:

#表示每隔3天17时19分07秒执行一次任务
sched.add_job(my_job, 'interval',days = 03,hours = 17,minutes = 19,seconds = 07)

(3). date 定时调度(作业只会执行一次)

run_date (datetime|str) ? the date/time to run the job at -(任务开始的时间)
timezone (datetime.tzinfo|str) ? time zone for run_date if it doesn't have one already

例子:

# The job will be executed on November 6th, 2009
sched.add_job(my_job, 'date', run_date=date(2009, 11, 6), args=['text'])
# The job will be executed on November 6th, 2009 at 16:30:05
sched.add_job(my_job, 'date', run_date=datetime(2009, 11, 6, 16, 30, 5), args=['text'])

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

Python 相关文章推荐
对python中Matplotlib的坐标轴的坐标区间的设定实例讲解
May 25 Python
python 将md5转为16字节的方法
May 29 Python
python 对txt中每行内容进行批量替换的方法
Jul 11 Python
Python 新建文件夹与复制文件夹内所有内容的方法
Oct 27 Python
python生成多个只含0,1元素的随机数组或列表的实例
Nov 12 Python
对Pyhon实现静态变量全局变量的方法详解
Jan 11 Python
在python 中split()使用多符号分割的例子
Jul 15 Python
Django 开发环境配置过程详解
Jul 18 Python
Python 硬币兑换问题
Jul 29 Python
40行Python代码实现天气预报和每日鸡汤推送功能
Feb 27 Python
不到20行实现Python代码即可制作精美证件照
Apr 24 Python
aws 通过boto3 python脚本打pach的实现方法
May 10 Python
Python xmltodict模块安装及代码实例
Oct 05 #Python
Python pathlib模块使用方法及实例解析
Oct 05 #Python
Python fileinput模块如何逐行读取多个文件
Oct 05 #Python
Python利用Pillow(PIL)库实现验证码图片的全过程
Oct 04 #Python
Python中random模块常用方法的使用教程
Oct 04 #Python
python代数式括号有效性检验示例代码
Oct 04 #Python
关于Python字符编码与二进制不得不说的一些事
Oct 04 #Python
You might like
Fine Uploader文件上传组件应用介绍
2013/01/06 PHP
php导出生成word的方法
2015/12/25 PHP
Yii基于CActiveForm的Ajax数据验证用法示例
2016/07/14 PHP
Yii2 中实现单点登录的方法
2018/03/09 PHP
兼容Mozilla必须知道的知识。
2007/01/09 Javascript
jQuery 遍历-nextUntil()方法以及prevUntil()方法的使用介绍
2013/04/26 Javascript
jQuery中$.fn的用法示例介绍
2013/11/05 Javascript
javascript内存管理详细解析
2013/11/11 Javascript
jQuery中map()方法用法实例
2015/01/06 Javascript
Javascript设计模式之观察者模式的多个实现版本实例
2015/03/03 Javascript
深入理解js中this的用法
2016/05/28 Javascript
基于JS实现导航条之调用网页助手小精灵的方法
2016/06/17 Javascript
在javascript中使用com组件的简单实现方法
2016/08/17 Javascript
js实现砖头在页面拖拉效果
2020/11/20 Javascript
js实现带缓动动画的导航栏效果
2017/01/16 Javascript
bootstrap实现二级下拉菜单效果
2017/11/23 Javascript
Vue.js搭建移动端购物车界面
2020/06/28 Javascript
JS引用传递与值传递的区别与用法分析
2018/06/01 Javascript
Node.js连接Sql Server 2008及数据层封装详解
2018/08/27 Javascript
nuxt框架中对vuex进行模块化设置的实现方法
2019/09/06 Javascript
js实现多个标题吸顶效果
2020/01/08 Javascript
基于js判断浏览器是否支持webGL
2020/04/18 Javascript
Vue Router中应用中间件的方法
2020/08/06 Javascript
[49:15]DOTA2-DPC中国联赛 正赛 CDEC vs XG BO3 第二场 1月19日
2021/03/11 DOTA
Python学习小技巧之列表项的推导式与过滤操作
2017/05/20 Python
python使用magic模块进行文件类型识别方法
2018/12/08 Python
pandas ix &iloc &loc的区别
2019/01/10 Python
Python 抓取微信公众号账号信息的方法
2019/06/14 Python
使用Python实现图像标记点的坐标输出功能
2019/08/14 Python
python通过安装itchat包实现微信自动回复收到的春节祝福
2020/01/19 Python
Python3通过chmod修改目录或文件权限的方法示例
2020/06/08 Python
法律进机关实施方案
2014/03/12 职场文书
三方合作协议书范本
2014/04/18 职场文书
党性心得体会
2014/09/03 职场文书
学校捐书活动总结
2015/05/08 职场文书
Java spring单点登录系统
2021/09/04 Java/Android