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将人民币转换大写的脚本代码
Feb 10 Python
初步介绍Python中的pydoc模块和distutils模块
Apr 13 Python
python实现的DES加密算法和3DES加密算法实例
Jun 03 Python
python写日志封装类实例
Jun 28 Python
Python实现复杂对象转JSON的方法示例
Jun 22 Python
Python机器学习之决策树算法实例详解
Dec 06 Python
python MySQLdb使用教程详解
Mar 20 Python
Python迭代器定义与简单用法分析
Apr 30 Python
python游戏开发之视频转彩色字符动画
Apr 26 Python
python GUI编程(Tkinter) 创建子窗口及在窗口上用图片绘图实例
Mar 04 Python
Python使用多进程运行含有任意个参数的函数
May 02 Python
如何将anaconda安装配置的mmdetection环境离线拷贝到另一台电脑
Oct 15 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
一个图形显示IP的PHP程序代码
2007/10/19 PHP
PHP手机号码归属地查询代码(API接口/mysql)
2012/09/04 PHP
实用的简单PHP分页集合包括使用方法
2013/10/21 PHP
详解PHP中的状态模式编程
2015/08/11 PHP
PHP文件管理之实现网盘及压缩包的功能操作
2017/09/20 PHP
javascript 广告后加载,加载完页面再加载广告
2010/11/25 Javascript
Nodejs使用mysql模块之获得更新和删除影响的行数的方法
2014/03/18 NodeJs
JavaScript语言对Unicode字符集的支持详解
2014/12/30 Javascript
JS+CSS实现自适应选项卡宽度的圆角滑动门效果
2015/09/15 Javascript
jquery实现限制textarea输入字数的方法
2017/09/06 jQuery
vue项目webpack中Npm传递参数配置不同域名接口
2018/06/15 Javascript
vue+element的表格实现批量删除功能示例代码
2018/08/17 Javascript
关于单文件组件.vue的使用
2018/09/20 Javascript
JS字典Dictionary类定义与用法示例
2019/02/01 Javascript
如何在项目中使用log4.js的方法步骤
2019/07/16 Javascript
vue实现吸顶、锚点和滚动高亮按钮效果
2019/10/21 Javascript
Vue常用传值方式、父传子、子传父及非父子实例分析
2020/02/24 Javascript
ES6 Symbol在对象中的作用实例分析
2020/06/06 Javascript
Vue实现可移动水平时间轴
2020/06/29 Javascript
浅谈在vue-cli3项目中解决动态引入图片img404的问题
2020/08/04 Javascript
Vue中keep-alive组件的深入理解
2020/08/23 Javascript
解决antd datepicker 获取时间默认少8个小时的问题
2020/10/29 Javascript
JavaScript动态生成表格的示例
2020/11/02 Javascript
[48:24]完美世界DOTA2联赛循环赛LBZS vs Forest 第一场 10月30日
2020/10/31 DOTA
Python中urllib+urllib2+cookielib模块编写爬虫实战
2016/01/20 Python
wxpython中Textctrl回车事件无效的解决方法
2016/07/21 Python
修复 Django migration 时遇到的问题解决
2018/06/14 Python
使用Flask集成bootstrap的方法
2018/07/24 Python
python excel转换csv代码实例
2019/08/26 Python
python对文件的操作方法汇总
2020/02/28 Python
jupyter notebook 参数传递给shell命令行实例
2020/04/10 Python
CSS3 制作绽放的莲花采用效果叠加实现
2013/01/31 HTML / CSS
篮球比赛口号
2014/06/10 职场文书
群众路线对照检查材料思想汇报怎么写
2014/09/18 职场文书
局领导领导班子四风对照检查材料
2014/09/27 职场文书
观看《信仰》心得体会
2016/01/15 职场文书