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没有来得及执行等。

ConstantEvent classTriggered when...

EVENT_SCHEDULER_STARTSchedulerEventThe scheduler is started

EVENT_SCHEDULER_SHUTDOWNSchedulerEventThe scheduler is shut down

EVENT_JOBSTORE_ADDEDJobStoreEventA job store is added to the scheduler

EVENT_JOBSTORE_REMOVEDJobStoreEventA job store is removed from the scheduler

EVENT_JOBSTORE_JOB_ADDEDJobStoreEventA job is added to a job store

EVENT_JOBSTORE_JOB_REMOVEDJobStoreEventA job is removed from a job store

EVENT_JOB_EXECUTEDJobEventA job is executed successfully

EVENT_JOB_ERRORJobEventA job raised an exception during execution

EVENT_JOB_MISSEDJobEventA 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

python定时任务框架_Python定时任务框架APScheduler相关推荐

  1. python unitest框架_python单元测试框架Unitest

    一.unitest简介 unittest是python内置的单元测试框架,具备编写用例.组织用例.执行用例.输出报告等自动化框架的条件. 使用unittest前需要了解该框架的五个概念: test c ...

  2. python 服务器框架_python 服务器框架

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 而我的想法是,掌握一个类似于框架的高级工具是有用的,但是基础的东西可以让你永远不 ...

  3. python三大框架_python 三大框架的 介绍。

    在python语言中,有着特别厉害的三大框架. 这三个框架分别为:Flask框架,Tornado框架,Django框架. Flask框架:Flask诞生于2010年,是Armin ronacher(人 ...

  4. python api开发框架_python api框架

    python常用框架 Django: Python Web应用开发框架 Django 应该是最出名的Python框架,GAE甚至Erlang都有框架受它影响.Django是走大而全的方向,它最出名的是 ...

  5. python api开发用什么框架_python api框架

    关于 python api框架的搜索结果 问题 哪种python框架仅适合于api 我是Python的新手,并希望使用python构建其余的完整Web服务.由于某些依赖性,无法使用任何其他脚本语言. ...

  6. python任务调度框架_python任务调度框架apscheduler【转】

    简介 APScheduler(以下简称APS)框架可以让用户定时执行或者周期性执行Python任务.既可以添加任务也可以删除任务,还可以将任务存储在数据库中.当APS重启之后,还会继续执行之前设置的任 ...

  7. python任务调度框架_Python任务调度模块APScheduler

    一.APScheduler 是什么&APScheduler四种组成部分? APScheduler全程为Advanced Python Scheduler,是一款轻量级的Python任务调度框架 ...

  8. python基础框架_Python基础框架和工具-阿里云开发者社区

    Python基础框架和工具 最近在学Python金融大数据分析,在安装Python进行大数据分析的环境时遇到很多问题,例如:在安装pandas包时候就要到各种错误,总是缺少很多安装包,最后发现利用Py ...

  9. python schedule多线程_Python定时任务sched模块用法示例

    本文实例讲述了Python定时任务sched模块用法.分享给大家供大家参考,具体如下: 通过sched模块可以实现通过自定义时间,自定义函数,自定义优先级来执行函数. 范例一 import time ...

最新文章

  1. C语言图书管理系统注册功能,图书管理系统的c语言源程序
  2. adb 测试工作中的总结
  3. (32)第一个驱动程序
  4. 8 .5 .5 创建操作员
  5. docker学习(一)ubuntu上安装docker
  6. 《计算机程序设计艺术》pdf
  7. 数据导入导出、备份恢复
  8. 十步轻松搞定IIS+PHP环境搭建
  9. Java故障定位方法总结
  10. 一次性尿袋行业调研报告 - 市场现状分析与发展前景预测(2021-2027年)
  11. postSql insert into 去重
  12. JavaSocket编程简单入门
  13. DRM-widevine 总结
  14. C语言如何作用于unity,在Unity 3D中使用C进行车轮转向#
  15. 2018年软件测试行业状态报告
  16. 相对传统桌面设计器,在线报表设计器价值何在?
  17. Windows10下电脑版微信未读消息自动弹窗工具
  18. X-Ways Forensics: 综合取证分析工具
  19. Pie-1-南丁格尔玫瑰图-中心带文字
  20. matlab多边形检测_Matlab图像处理学习笔记(四):多边形检测

热门文章

  1. 某东商城获取eid和fp参数方法
  2. CUDA中并行规约(Parallel Reduction)的优化
  3. 数组小案例(求数组最大最小值、反转数组中元素、指定元素第一次出现的索引)
  4. zblog php 调用缩略图,缩略图插件
  5. 举例说明string类和stringbuffer类的区别_String,StringBuilder,StringBuffer的区别
  6. java string jdk_Java.lang.String中JDK API 1.6.0摘要。
  7. python执行的命令_如何在Python中执行外部命令
  8. 9_python基础—数据序列(公共方法)
  9. python列表赋值 连续整数_Python_03_字符串_数据类型_for循环_列表操作
  10. java过滤lsit重复_java 8 中获取List结合中过滤后的重复数据