文档章节

Python定时任务框架APScheduler

ArlenXu
 ArlenXu
发布于 2016/04/12 16:03
字数 1025
阅读 214
收藏 7
点赞 1
评论 0

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

1. 安装

        安装过程很简单,可以基于easy_install和源码。

[plain] view plain copy print?

easy_install apscheduler  

        或者下载源码,运行命令:

[plain] view plain copy print?

python setup.py install  

2. cron job例子

        APScheduler是进程内的调度器,可以定时触发具体的函数,并且可以访问应用的所有变量和函数。在web应用中通过APScheduler实现定时任务是很方便的。下面看例子:

[python] view plain copy print?

from apscheduler.scheduler import Scheduler  

  

schedudler = Scheduler(daemonic = False)  

 

@schedudler.cron_schedule(second='*', day_of_week='0-4', hour='9-12,13-15')  

def quote_send_sh_job():  

    print 'a simple cron job start at', datetime.datetime.now()  

  

schedudler.start()  

        上面通过装饰器定义了cron job,可以通过函数scheduler.add_cron_job添加,用装饰器更方便。Scheduler构造函数中传入daemonic参数,表示执行线程是非守护的,在Schduler的文档中推荐使用非守护线程:

[plain] view plain copy print?

Jobs are always executed in non-daemonic threads.  

        具体cron job的配置参看doc,基本上与Quartz一致。

        在添加job时还有一个比较重要的参数max_instances,指定一个job的并发实例数,默认值是1。默认情况下,如果一个job准备执行,但是该job的前一个实例尚未执行完,则后一个job会失败,可以通过这个参数来改变这种情况。

3. Store

        APScheduler提供了jobstore用于存储job的执行信息,默认使用的是RAMJobStore,还提供了SQLAlchemyJobStore、ShelveJobStore和MongoDBJobStore。APScheduler允许同时使用多个jobstore,通过别名(alias)区分,在添加job时需要指定具体的jobstore的别名,否则使用的是别名是default的jobstore,即RAMJobStore。下面以MongoDBJobStore举例说明。

[python] view plain copy print?

import pymongo  

from apscheduler.scheduler import Scheduler  

from apscheduler.jobstores.mongodb_store import MongoDBJobStore  

import time  

  

sched = Scheduler(daemonic = False)  

  

mongo = pymongo.Connection(host='127.0.0.1', port=27017)  

store = MongoDBJobStore(connection=mongo)  

sched.add_jobstore(store, 'mongo')        # 别名是mongo  

 

@sched.cron_schedule(second='*', day_of_week='0-4', hour='9-12,13-15', jobstore='mongo')        # 向别名为mongo的jobstore添加job  

def job():  

        print 'a job'  

        time.sleep(1)  

  

sched.start()  

        注意start必须在添加job动作之后调用,否则会抛错。默认会把job信息保存在apscheduler数据库下的jobs表:

[plain] view plain copy print?

> db.jobs.findOne()  

{  

        "_id" : ObjectId("502202d1443c1557fa8b8d66"),  

        "runs" : 20,  

        "name" : "job",  

        "misfire_grace_time" : 1,  

        "coalesce" : true,  

        "args" : BinData(0,"gAJdcQEu"),  

        "next_run_time" : ISODate("2012-08-08T14:10:46Z"),  

        "max_instances" : 1,  

        "max_runs" : null,  

        "trigger" : BinData(0,"gAJjYXBzY2hlZHVsZXIudHJpZ2dlcnMuY3JvbgpDcm9uVHJpZ2dlcgpxASmBcQJ9cQMoVQZmaWVsZHNxBF1xBShjYXBzY2hlZHVsZXIudHJpZ2dlcnMuY3Jvbi5maWVsZHMKQmFzZUZpZWxkCnEGKYFxB31xCChVCmlzX2RlZmF1bHRxCYhVC2V4cHJlc3Npb25zcQpdcQtjYXBzY2hlZHVsZXIudHJpZ2dlcnMuY3Jvbi5leHByZXNzaW9ucwpBbGxFeHByZXNzaW9uCnEMKYFxDX1xDlUEc3RlcHEPTnNiYVUEbmFtZXEQVQR5ZWFycRF1YmgGKYFxEn1xEyhoCYhoCl1xFGgMKYFxFX1xFmgPTnNiYWgQVQVtb250aHEXdWJjYXBzY2hlZHVsZXIudHJpZ2dlcnMuY3Jvbi5maWVsZHMKRGF5T2ZNb250aEZpZWxkCnEYKYFxGX1xGihoCYhoCl1xG2gMKYFxHH1xHWgPTnNiYWgQVQNkYXlxHnViY2Fwc2NoZWR1bGVyLnRyaWdnZXJzLmNyb24uZmllbGRzCldlZWtGaWVsZApxHymBcSB9cSEoaAmIaApdcSJoDCmBcSN9cSRoD05zYmFoEFUEd2Vla3EldWJjYXBzY2hlZHVsZXIudHJpZ2dlcnMuY3Jvbi5maWVsZHMKRGF5T2ZXZWVrRmllbGQKcSYpgXEnfXEoKGgJiWgKXXEpY2Fwc2NoZWR1bGVyLnRyaWdnZXJzLmNyb24uZXhwcmVzc2lvbnMKUmFuZ2VFeHByZXNzaW9uCnEqKYFxK31xLChoD05VBGxhc3RxLUsEVQVmaXJzdHEuSwB1YmFoEFULZGF5X29mX3dlZWtxL3ViaAYpgXEwfXExKGgJiWgKXXEyKGgqKYFxM31xNChoD05oLUsMaC5LCXViaCopgXE1fXE2KGgPTmgtSw9oLksNdWJlaBBVBGhvdXJxN3ViaAYpgXE4fXE5KGgJiGgKXXE6aAwpgXE7fXE8aA9Oc2JhaBBVBm1pbnV0ZXE9dWJoBimBcT59cT8oaAmJaApdcUBoDCmBcUF9cUJoD05zYmFoEFUGc2Vjb25kcUN1YmVVCnN0YXJ0X2RhdGVxRE51Yi4="),  

        "func_ref" : "__main__:job",  

        "kwargs" : BinData(0,"gAJ9cQEu")  

}  

        上面就是存储的具体信息。

4.异常处理

        当job抛出异常时,APScheduler会默默的把他吞掉,不提供任何提示,这不是一种好的实践,我们必须知晓程序的任何差错。APScheduler提供注册listener,可以监听一些事件,包括:job抛出异常、job没有来得及执行等。

Constant Event class Triggered when...

EVENT_SCHEDULER_START SchedulerEvent The scheduler is started

EVENT_SCHEDULER_SHUTDOWN SchedulerEvent The scheduler is shut down

EVENT_JOBSTORE_ADDED JobStoreEvent A job store is added to the scheduler

EVENT_JOBSTORE_REMOVED JobStoreEvent A job store is removed from the scheduler

EVENT_JOBSTORE_JOB_ADDED JobStoreEvent A job is added to a job store

EVENT_JOBSTORE_JOB_REMOVED JobStoreEvent A job is removed from a job store

EVENT_JOB_EXECUTED JobEvent A job is executed successfully

EVENT_JOB_ERROR JobEvent A job raised an exception during execution

EVENT_JOB_MISSED JobEvent A job’s execution time is missed

        看下面的例子,监听异常和miss事件,这里用logging模块打印日志,logger.exception()可以打印出异常堆栈信息。

[python] view plain copy print?

def err_listener(ev):  

    err_logger = logging.getLogger('schedErrJob')  

    if ev.exception:  

        err_logger.exception('%s error.', str(ev.job))  

    else:  

        err_logger.info('%s miss', str(ev.job))  

  

schedudler.add_listener(err_listener, apscheduler.events.EVENT_JOB_ERROR | apscheduler.events.EVENT_JOB_MISSED)  

        事件的属性包括:

job – the job instance in question

scheduled_run_time – the time when the job was scheduled to be run

retval – the return value of the successfully executed job

exception – the exception raised by the job

traceback – the traceback object associated with the exception

        最后,需要注意一点当job不以daemon模式运行时,并且APScheduler也不是daemon的,那么在关闭脚本时,Ctrl + C是不奏效的,必须kill才可以。可以通过命令实现关闭脚本:

[plain] view plain copy print?

ps axu | grep {脚本名} | grep -v grep | awk '{print $2;}' | xargs kill  


© 著作权归作者所有

共有 人打赏支持
ArlenXu
粉丝 12
博文 101
码字总数 63110
作品 0
杭州
后端工程师
Python下定时任务框架APScheduler的使用

今天准备实现一个功能需要用到定时执行任务,所以就看到了Python的一个定时任务框架APScheduler,试了一下感觉还不错。 1.APScheduler简介: APScheduler是Python的一个定时任务框架,可以很...

OMCloud
06/26
0
0
python定时任务:apscheduler的使用(还有一个celery~)

文章摘自:https://www.cnblogs.com/luxiaojun/p/6567132.html 1 . 安装 2 . 简单例子 操作作业 上面是通过addjob()来添加作业,另外还有一种方式是通过scheduledjob()修饰器来修饰函数 移除...

chbsxni
07/16
0
0
python apscheduler任务堵塞问题

我需要执行一个任务,一分钟一次,有网络请求,但不知道什么原因,偶尔总会堵塞,print都没有打印信息显示到终端。而且它后面的都不执行任务了,一直堵在着。我有点纳闷,按道理一个任务堵塞...

whqwhq
06/04
0
0
Python定时任务(下)

图片来自 unsplash 上篇文章,我们了解到有三种办法能实现定时任务,但是都无法做到循环执行定时任务。因此,需要一个能够担当此重任的库。它就是。 1 简介 的全称是。它是一个轻量级的 Pyth...

猴哥Yuri
2017/12/13
0
0
python使用apscheduler做定时任务的管理

工作中经常需要做一些定时任务,之前基本都是用crontab来定时执行脚本,python也有一个apscheduler方便进行定时任务的管理,所以我简单学习了下apscheduler的使用。 BlockingScheduler # co...

子夜闻雪
2016/02/15
1K
0
Python任务调度模块 – APScheduler

Python任务调度模块 – APScheduler 2015年6月11日 by debugo · 14条评论 APScheduler简介 APScheduler是一个Python定时任务框架,使用起来十分方便。提供了基于日期、固定时间间隔以及cro...

openthings
2016/04/19
352
0
Kreminder,python写的定时提醒工具

Kreminder 定时提醒工具,间隔一段时间之后提醒长时间坐在电脑面前的你休息一下。 源码:http://git.oschina.net/kuanghy/kreminder 开发初衷 对于需要长时间坐在电脑前工作的人来说,适当起...

openthings
2016/01/10
385
1
Konghy/kreminder

Kreminder 定时提醒工具,间隔一段时间之后提醒长时间坐在电脑面前的你休息一下。 开发初衷 对于需要长时间坐在电脑前工作的人来说,适当起来活动活动总是好的。如果长时间坐在电脑前不动,对...

Konghy
2016/01/09
0
0
Python任务调度模块 – APScheduler

APScheduler是一个Python定时任务框架,使用起来十分方便。提供了基于日期、固定时间间隔以及crontab类型的任务,并且可以持久化任务、并以daemon方式运行应用。目前最新版本为3.0.x。 在APS...

ArlenXu
2016/04/13
85
0
Python任务调度框架--APScheduler

一个基于Python,提供类似Cron功能,并深受Java Quartz 影响的轻量级进程内任务调度框架。 Advanced Python Scheduler (APScheduler) is a light but powerful in-process task scheduler th...

匿名
2011/08/17
6.5K
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

50 行 Python 代码,带你追到最心爱的人

程序员世纪难题 人们一提到程序员第一反应就是:我知道!他们工资很高啊!但大部分都是单身狗,不懂得幽默风趣,只是每天穿格子 polo 衫的宅男一个。甚至程序员自己也这样形容自己:钱多话少...

猫咪编程
6分钟前
0
0
JAVA知识点随心记

1.Switch case具体的支持类型? Q:支持byte、short、char、int基本类型,枚举类型和String类型(JDK7以上支持),四种基本类型的包装类型也支持,但是原因在于触发了自动拆箱,将包装类型拆成了基本...

勤奋的蚂蚁
16分钟前
0
0
NoSQL

一、NoSQL介绍 NoSQL属于非关系型数据,mysql属于关系型数据库。 对于关系型数据库来说,是需要把数据存储到库、表、行、字段里,查询的时候根据条件一行一行地去匹配,当数据量非常大的时候...

人在艹木中
21分钟前
0
0
第17章MySQL主从配置

mysql安装总结 mysql主从准备工作: 准备两台机器,每台机器安装msyql服务,并启动mysql服务 mysql详细安装 1.首先下载二进制免编译的包,下载到/usr/local/src/目录下 2.解压压缩包 3.解压完...

Linux学习笔记
25分钟前
0
0
Redis高可用及分片集群

一、主从复制 使用异步复制 一个服务器可以有多个从服务器 从服务器也可以有自己的从服务器 复制功能不会阻塞主服务器 可以通过服务功能来上主服务器免于持久化操作,由从服务器去执行持久化...

Java大蜗牛
29分钟前
0
0
前端面试题汇总

最近在复习,准备找工作了,特此总结一下前端的相关知识。 1.获取浏览器URL中查询字符的参数: function getQuery(name){    var reg = new RegExp("(^|&)"+name+"=([^&]*)"(&|$));...

凛冬来袭
今天
0
0
可持续发展的学习道路

与其要求别人,不如提升自己 内心渴望进步 经常做出改变现有模式,不断学习 寻找资源,整合资源,不断熟练这种模式 渠道很重要 先打开新世界的航路

狮子狗
今天
0
0
apollox-lua开源项目 示例codepen2

今天在示例上增加了几个功能, 首先添加js array的标准库。 所有js array的方法目前都支持了。 添加查看code模式。 点击查看code可以看到生成的lua代码。默认web模式需要把标准库连接进来, ...

钟元OSS
今天
0
0
javascript性能优化之避免重复工作

javascript最重要也最根本的性能优化标准之一是避免工作,避免工作又包括两点,第一,不做不必要的工作,第二,不做重复的已经完成的工作。第一部分可以通过代码重构完成,第二部分不做重复的...

老韭菜
今天
0
0
缓存穿透、并发和雪崩那些事

0 题记 缓存穿透、缓存并发和缓存雪崩是常见的由于并发量大而导致的缓存问题,本文讲解其产生原因和解决方案。 缓存穿透通常是由恶意攻击或者无意造成的;缓存并发是由设计不足造成的;缓存雪...

Java填坑之路
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部