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使用fcntl模块实现程序加锁功能示例
Jun 23 Python
Python中函数eval和ast.literal_eval的区别详解
Aug 10 Python
Python字符编码与函数的基本使用方法
Sep 30 Python
Python编程之基于概率论的分类方法:朴素贝叶斯
Nov 11 Python
python实现超市扫码仪计费
May 30 Python
python+ffmpeg批量去视频开头的方法
Jan 09 Python
对python dataframe逻辑取值的方法详解
Jan 30 Python
Django uwsgi Nginx 的生产环境部署详解
Feb 02 Python
python进程和线程用法知识点总结
May 28 Python
Python Collatz序列实现过程解析
Oct 12 Python
Python JSON编解码方式原理详解
Jan 20 Python
Python-openpyxl表格读取写入的案例详解
Nov 02 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程序时遇到的三个问题
2012/01/17 PHP
PHP中使用OpenSSL生成证书及加密解密
2017/02/05 PHP
php实现生成code128条形码的方法详解
2017/07/19 PHP
JQuery Easyui Tree的oncheck事件实现代码
2010/05/28 Javascript
前台js调用后台方法示例
2013/12/02 Javascript
浅析jquery ajax异步调用方法中不能给全局变量赋值的原因及解决方法
2014/01/10 Javascript
一个JavaScript防止表单重复提交的实例
2014/10/21 Javascript
原生javascript实现简单的datagrid数据表格
2015/01/02 Javascript
JavaScript通过事件代理高亮显示表格行的方法
2015/05/27 Javascript
使用D3.js创建物流地图的示例代码
2018/01/27 Javascript
node内置调试方法总结
2018/02/22 Javascript
使用React-Router实现前端路由鉴权的示例代码
2020/07/26 Javascript
[01:30]DOTA2上海特锦赛现场采访 Loda倾情献唱
2016/03/25 DOTA
Python连接mssql数据库编码问题解决方法
2015/01/01 Python
python 类对象和实例对象动态添加方法(分享)
2017/12/31 Python
python和shell获取文本内容的方法
2018/06/05 Python
Matplotlib中文乱码的3种解决方案
2018/11/15 Python
详解pyppeteer(python版puppeteer)基本使用
2019/06/12 Python
使用 Django Highcharts 实现数据可视化过程解析
2019/07/31 Python
python os.fork() 循环输出方法
2019/08/08 Python
Python一行代码解决矩阵旋转的问题
2019/11/30 Python
Pytorch十九种损失函数的使用详解
2020/04/29 Python
Selenium元素定位的30种方式(史上最全)
2020/05/11 Python
巴西最大的体育用品商城:Netshoes巴西
2016/11/29 全球购物
澳大利亚电子产品购物网站:Dick Smith
2017/02/02 全球购物
国际贸易专业推荐信
2013/11/15 职场文书
体育教师自荐信范文
2013/12/16 职场文书
村委会主任先进事迹
2014/01/15 职场文书
致400米运动员广播稿
2014/02/07 职场文书
关于元旦的广播稿
2014/02/16 职场文书
护士岗位职责
2014/02/16 职场文书
汉语言文学专业求职信
2014/06/19 职场文书
报考公务员诚信承诺书
2014/08/29 职场文书
教师学习八项规定六项禁令思想汇报
2014/09/27 职场文书
大学生入党群众意见书
2015/06/02 职场文书
中学后勤工作总结2015
2015/07/22 职场文书