Python定时任务APScheduler的实例实例详解


Posted in Python onJuly 22, 2019

APScheduler 支持三种调度任务:固定时间间隔,固定时间点(日期),Linux 下的 Crontab 命令。同时,它还支持异步执行、后台执行调度任务。

一、基本架构

  1. 触发器 triggers:设定触发任务的条件
  2. 描述一个任务何时被触发,按日期或按时间间隔或按 cronjob 表达式三种方式触发
  3. 任务存储器 job stores:存放任务,可以放内存(默认)或数据库
  4. 注:调度器之间不能共享任务存储器
  5. 执行器 executors:用于执行任务,可设定执行模式
  6. 将指定的作业提交到线程池或者进程池中运行,任务完成通知调度器触发相应的事件。
  7. 调度器 schedulers:将上方三个组件作为参数,创建调度器实例执行。

协调三个组件的运行。

二、调度器组件(schedulers)

  • BlockingScheduler 阻塞式调度器

调度程序是进程中唯一运行的进程,调用start函数会阻塞当前线程,不能立即返回。

from apscheduler.schedulers.blocking import BlockingScheduler
import time
scheduler = BlockingScheduler()
def job1():
 print "%s: 执行任务" % time.asctime()
scheduler.add_job(job1, 'interval', seconds=3)
scheduler.start()
  • BackgroundScheduler 后台调度器

当前线程不会阻塞,调度器后台执行

from apscheduler.schedulers.background import BackgroundScheduler
import time
scheduler = BackgroundScheduler()
def job1():
 print "%s: 执行任务" % time.asctime()
scheduler.add_job(job1, 'interval', seconds=3)
scheduler.start()
time.sleep(10)

注:10秒执行完后,程序结束。

  • AsyncIOScheduler AsyncIO调度器

适用于使用了asyncio的情况

from apscheduler.schedulers.asyncio import AsyncIOScheduler
import asyncio
...
...
try:
 asyncio.get_event_loop().run_forever()
except (KeyboardInterrupt, SystemExit):
 pass
  • GeventScheduler Gevent调度器

使用了Gevent的情况

from apscheduler.schedulers.gevent import GeventScheduler
...
...
g = scheduler.start()
try:
 g.join()
except (KeyboardInterrupt, SystemExit):
 pass

  • TornadoScheduler Tornado调度器

适用于构建Tornado应用

  • TwistedScheduler Twisted调度器

适用于构建Twisted应用

  • QtScheduler Qt调度器

适用于构建Qt应用

三、触发器组件(trigger)

date :只在某个时间点执行一次,具体日期

run_date(datetime|str)

scheduler.add_job(my_job, 'date', run_date=datetime(2019, 7, 12, 15, 30, 5), args=[])
scheduler.add_job(my_job, 'date', run_date="2019-07-12", args=[])

timezone 指定时区

interval :每隔一段时间允许一次,时间间隔

weeks=0 | days=0 | hours=0 | minutes=0 | seconds=0, start_date=None, end_date=None, timezone=None
scheduler.add_job(my_job, 'interval', hours=2)
scheduler.add_job(my_job, 'interval', hours=2, start_date='2017-9-8 21:30:00', end_date='2018-06-15 21:30:00)

cron :任务的运行周期

(year=None, month=None, day=None, week=None, day_of_week=None, hour=None, minute=None, second=None, start_date=None, end_date=None, timezone=None)

除了week和 day_of_week,它们的默认值是 *

例如 day=1, minute=20 ,这就等于 year='*', month='*', day=1, week='*', day_of_week='*', hour='*', minute=20, second=0 ,工作将在每个月的第一天以每小时20分钟的时间执行

表达式类型

表达式 参数类型 描述
* 所有 通配符。例: minutes=* 即每分钟触发
*/a 所有 可被a整除的通配符。
a-b 所有 范围a-b触发
a-b/c 所有 范围a-b,且可被c整除时触发
xth y 第几个星期几触发。x为第几个,y为星期几
last x 一个月中,最后个星期几触发
last 一个月最后一天触发
x,y,z 所有 组合表达式,可以组合确定值或上方的表达式

注:当设置的时间间隔小于,任务的执行时间,线程会阻塞住,等待执行完了才能执行下一个任务,可以设置 max_instance 指定一个任务同一时刻有多少个实例在运行,默认为1

四、配置调度器

线程池执行器默认为10,内存任务存储器为 memoryjobstore ,如果想自己配置的话可以执行以下操作

需求:

  • 两个任务储存器分别搭配两个执行器;同时,还要修改任务的默认参数;最后还要改时区
  • 名称为“mongo”的 MongoDBJobStore
  • 名称为“default”的 SQLAlchemyJobStore
  • 名称为“ThreadPoolExecutor ”的 ThreadPoolExecutor ,最大线程20个
  • 名称“processpool”的 ProcessPoolExecutor ,最大进程5个
  • UTC时间作为调度器的时区
  • 默认为新任务关闭 合并模式 ()
  • 设置新任务的默认最大实例数为3

方法一:

from pytz import utc
from apscheduler.schedulers.background import BackgroundScheduler
from apscheduler.jobstores.mongodb import MongoDBJobStore
from apscheduler.jobstores.sqlalchemy import SQLAlchemyJobStore
from apscheduler.executors.pool import ThreadPoolExecutor, ProcessPoolExecutor
jobstores = {
 'mongo': MongoDBJobStore(),
 'default': SQLAlchemyJobStore(url='sqlite:///jobs.sqlite')
}
executors = {
 'default': ThreadPoolExecutor(20),
 'processpool': ProcessPoolExecutor(5)
}
job_defaults = {
 'coalesce': False,
 'max_instances': 3
}
scheduler = BackgroundScheduler(jobstores=jobstores, executors=executors, job_defaults=job_defaults, timezone=utc)

方法二:

from apscheduler.schedulers.background import BackgroundScheduler
# The "apscheduler." prefix is hard coded
scheduler = BackgroundScheduler({
 'apscheduler.jobstores.mongo': {
   'type': 'mongodb'
 },
 'apscheduler.jobstores.default': {
  'type': 'sqlalchemy',
  'url': 'sqlite:///jobs.sqlite'
 },
 'apscheduler.executors.default': {
  'class': 'apscheduler.executors.pool:ThreadPoolExecutor',
  'max_workers': '20'
 },
 'apscheduler.executors.processpool': {
  'type': 'processpool',
  'max_workers': '5'
 },
 'apscheduler.job_defaults.coalesce': 'false',
 'apscheduler.job_defaults.max_instances': '3',
 'apscheduler.timezone': 'UTC',
})

方法三:

from pytz import utc
from apscheduler.schedulers.background import BackgroundScheduler
from apscheduler.jobstores.sqlalchemy import SQLAlchemyJobStore
from apscheduler.executors.pool import ProcessPoolExecutor
jobstores = {
 'mongo': {'type': 'mongodb'},
 'default': SQLAlchemyJobStore(url='sqlite:///jobs.sqlite')
}
executors = {
 'default': {'type': 'threadpool', 'max_workers': 20},
 'processpool': ProcessPoolExecutor(max_workers=5)
}
job_defaults = {
 'coalesce': False,
 'max_instances': 3
}
scheduler = BackgroundScheduler()
# ..这里可以添加任务
scheduler.configure(jobstores=jobstores, executors=executors, job_defaults=job_defaults, timezone=utc)

五、启动调度器

除了 BlockingScheduler 外,其他非阻塞的调度器都会立即返回,运行之后的代码。

BlockingScheduler 需要将运行的代码放在start()之前

1.添加任务

1.调用add_job()  #可以传参max_instance,同一任务的运行实例个数

  当有任务中途中断,后面恢复后,有N个任务没有执行 
    coalesce:true ,恢复的任务会执行一次
    coalesce:false,恢复后的任务会执行N次配合misfire_grace_time使用
    misfire_grace_time设置时间差值,由于某些原因没有运行,再次提交时,大于设置的时间,实例不会运行。

2.装饰器scheduled_job()

立即运行可以不设置trigger参数

2.移除任务

# 根据任务实例删除
job = scheduler.add_job(myfunc, 'interval', minutes=2)
job.remove()
# 根据任务id删除
scheduler.add_job(myfunc, 'interval', minutes=2, id='my_job_id')
scheduler.remove_job('my_job_id')

3.暂停任务

job = scheduler.add_job(myfunc, 'interval', minutes=2)
# 根据任务实例
job.pause() #暂停
job.resume() #继续
# 根据任务id暂停
scheduler.add_job(myfunc, 'interval', minutes=2, id='my_job_id')
scheduler.pause_job('my_job_id')
scheduler.resume_job('my_job_id')

4.调度器操作

scheduler.start() #开启
scheduler.shotdown(wait=True|False) #关闭 False 无论任务是否执行,强制关闭

异常捕获

# 可以添加apscheduler日志至DEBUG级别,这样就能捕获异常信息
import logging
logging.basicConfig()
logging.getLogger('apscheduler').setLevel(logging.DEBUG)

总结

以上所述是小编给大家介绍的Python定时任务APScheduler的实例实例详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Python 相关文章推荐
一个小示例告诉你Python语言的优雅之处
Jul 04 Python
Python中用Decorator来简化元编程的教程
Apr 13 Python
基于Django contrib Comments 评论模块(详解)
Dec 08 Python
5个很好的Python面试题问题答案及分析
Jan 19 Python
Python结合ImageMagick实现多张图片合并为一个pdf文件的方法
Apr 24 Python
python检索特定内容的文本文件实例
Jun 05 Python
基于Python pip用国内镜像下载的方法
Jun 12 Python
Python使用itertools模块实现排列组合功能示例
Jul 02 Python
python bmp转换为jpg 并删除原图的方法
Oct 25 Python
python Dijkstra算法实现最短路径问题的方法
Sep 19 Python
python中matplotlib实现随鼠标滑动自动标注代码
Apr 23 Python
python中导入 train_test_split提示错误的解决
Jun 19 Python
基于多进程中APScheduler重复运行的解决方法
Jul 22 #Python
django云端留言板实例详解
Jul 22 #Python
python实现图片中文字分割效果
Jul 22 #Python
django用户登录验证的完整示例代码
Jul 21 #Python
Python Threading 线程/互斥锁/死锁/GIL锁
Jul 21 #Python
详解Django模版中加载静态文件配置方法
Jul 21 #Python
django数据库自动重连的方法实例
Jul 21 #Python
You might like
php class中self,parent,this的区别以及实例介绍
2013/04/24 PHP
php+xml结合Ajax实现点赞功能完整实例
2015/01/30 PHP
刷新PHP缓冲区为你的站点加速
2015/10/10 PHP
php使用正则表达式去掉html中的注释方法
2016/11/03 PHP
yii框架无限极分类的实现方法
2017/04/08 PHP
jQuery页面滚动浮动层智能定位实例代码
2011/08/23 Javascript
扩展JavaScript功能的正确方法(译文)
2012/04/12 Javascript
JavaScript控制各种浏览器全屏模式的方法、属性和事件介绍
2014/04/03 Javascript
使用js画图之饼图
2015/01/12 Javascript
javascript最基本的函数汇总
2015/06/25 Javascript
JavaScript里 ==与===区别详解
2016/08/16 Javascript
JavaScript实现数组降维详解
2017/01/05 Javascript
基于MVC方式实现三级联动(JavaScript)
2017/01/23 Javascript
微信小程序之网络请求简单封装实例详解
2017/06/28 Javascript
vue中添加mp3音频文件的方法
2018/03/02 Javascript
vue调试工具vue-devtools安装及使用方法
2018/11/07 Javascript
jQuery实现简易聊天框
2020/02/08 jQuery
Vue 样式切换及三元判断样式关联操作
2020/08/09 Javascript
python批量生成本地ip地址的方法
2015/03/23 Python
python数据处理实战(必看篇)
2017/06/11 Python
Python基于辗转相除法求解最大公约数的方法示例
2018/04/04 Python
python基于SMTP协议发送邮件
2019/05/31 Python
python3.7环境下安装Anaconda的教程图解
2019/09/10 Python
Django框架安装方法图文详解
2019/11/04 Python
Python3如何在Windows和Linux上打包
2020/02/25 Python
python中rb含义理解
2020/06/18 Python
如何在Canvas中添加事件的方法示例
2019/05/21 HTML / CSS
英国计算机产品零售商:Novatech(定制个人电脑、笔记本电脑、工作站和服务器)
2018/01/28 全球购物
财务总经理岗位职责
2014/02/16 职场文书
优秀教师申报材料
2014/12/16 职场文书
学期个人自我总结
2015/02/13 职场文书
2015年党员发展工作总结
2015/05/13 职场文书
2015最新民情日记范文
2015/06/26 职场文书
2016入党积极分子心得体会
2016/01/06 职场文书
幼儿教师继续教育培训心得体会
2016/01/19 职场文书
MySQL中TIMESTAMP类型返回日期时间数据中带有T的解决
2022/12/24 MySQL