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回调函数用法实例分析
May 09 Python
Python检测字符串中是否包含某字符集合中的字符
May 21 Python
Python字典实现简单的三级菜单(实例讲解)
Jul 31 Python
Python中支持向量机SVM的使用方法详解
Dec 26 Python
Python实现找出数组中第2大数字的方法示例
Mar 26 Python
Python占用的内存优化教程
Jul 28 Python
python 单线程和异步协程工作方式解析
Sep 28 Python
Python实现图像去噪方式(中值去噪和均值去噪)
Dec 18 Python
python爬虫模拟浏览器访问-User-Agent过程解析
Dec 28 Python
python实现从尾到头打印单链表操作示例
Feb 22 Python
python GUI库图形界面开发之pyinstaller打包python程序为exe安装文件
Feb 26 Python
浅析Python中字符串的intern机制
Oct 03 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
解析isset与is_null的区别
2013/08/09 PHP
跟我学Laravel之快速入门
2014/10/15 PHP
php curl请求信息和返回信息设置代码实例
2015/04/27 PHP
CodeIgniter多语言实现方法详解
2016/01/20 PHP
php遍历替换目录下文件指定内容的方法
2016/11/10 PHP
PHP二维数组去重算法
2016/12/17 PHP
Javascript 验证上传图片大小[客户端]
2009/08/01 Javascript
Extjs学习过程中新手容易碰到的低级错误积累
2010/02/11 Javascript
多种方法判断Javascript对象是否存在
2013/09/22 Javascript
javascript禁用键盘功能键让右击及其他键无效
2013/10/09 Javascript
Jquery实现图片放大镜效果的思路及代码(自写)
2013/10/18 Javascript
jQuery动态添加、删除元素的方法
2014/01/09 Javascript
Bootstrap弹出框(modal)垂直居中的问题及解决方案详解
2016/06/12 Javascript
jQuery实现带遮罩层效果的blockUI弹出层示例【附demo源码下载】
2016/09/14 Javascript
NodeJS学习笔记之Module的简介
2017/03/24 NodeJs
npm配置国内镜像资源+淘宝镜像的方法
2018/09/07 Javascript
js canvas实现二维码和图片合成的海报
2020/11/19 Javascript
解决vue组件中click事件失效的问题
2019/11/09 Javascript
vue新建项目并配置标准路由过程解析
2019/12/09 Javascript
js回到页面指定位置的三种方式
2020/12/17 Javascript
Python OpenCV处理图像之滤镜和图像运算
2018/07/10 Python
Python自定义函数计算给定日期是该年第几天的方法示例
2019/05/30 Python
简单了解python装饰器原理及使用方法
2019/12/18 Python
Python代码需要缩进吗
2020/07/01 Python
浅析HTML5页面元素及属性
2021/01/20 HTML / CSS
哈萨克斯坦最大的时装、鞋子和配饰在线商店:Lamoda.kz
2019/11/19 全球购物
幼儿园教师获奖感言
2014/03/11 职场文书
入党推优材料
2014/06/02 职场文书
党员群众路线对照检查材料
2014/08/31 职场文书
2015年爱牙日活动总结
2015/03/23 职场文书
2015年电厂工作总结范文
2015/05/13 职场文书
2015年生产部工作总结范文
2015/05/25 职场文书
情感电台广播稿
2015/08/18 职场文书
SpringBoot读取Resource下文件的4种方法
2021/07/02 Java/Android
铁头也玩根德 YachtBoy YB-230......
2022/04/05 无线电
Java Redisson多策略注解限流
2022/09/23 Java/Android