lovebetPython定时任务框架APScheduler

 
APScheduler是基于Quartz
一个Python定时职责框架,达成了Quartz的保有机能,使用起来良好有利。提供了按照日期、固定时间距离以及crontab类型的天职,并且可以持久化职务。基于那么些意义,大家可以很有利的贯彻一个python定时义务系统,写python照旧要比java舒服多了。

 APScheduler是基于Quartz的一个Python定时职务框架,完结了Quartz的具有机能,使用起来万分利于。提供了基于日期、固定时间间隔以及crontab类型的职务,并且可以持久化职务。基于那个功能,大家可以很便利的完成一个python定时任务系统,写python照旧要比java舒服多了。
        安装进度很粗略,可以基于easy_install和源码。
[plain] 
easy_install apscheduler 
        或者下载源码,运行命令:
[plain]
python setup.py install 
      
APScheduler是经过内的调度器,可以定时触发具体的函数,并且可以访问应用的兼具变量和函数。在web应用中经过APScheduler落成定时职分是很有益的。上面看例子:
[python]
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] 
Jobs are always executed in non-daemonic threads. 
        具体cron job的安排参看doc,基本上与Quartz一致。
       
在添加job时还有一个相比较主要的参数max_instances,指定一个job的并发实例数,默许值是1。默许景况下,借使一个job准备进行,不过该job的前一个实例尚未履行完,则后一个job会败北,可以经过那么些参数来改变这种气象。
       
APScheduler提供了jobstore用于存储job的履行新闻,默认使用的是RAMJobStore,还提供了SQLAlchemyJobStore、ShelveJobStore和MongoDBJobStore。APScheduler允许同时采纳多个jobstore,通过别名(alias)区分,在添加job时索要指定具体的jobstore的别名,否则使用的是别名是default的jobstore,即RAMJobStore。上边以MongoDBJobStore举例表达。
[python] 
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’)<span
style=”white-space:pre”>    </span># 别名是mongo 
 
@sched.cron_schedule(second=’*’, day_of_week=’0-4′,
hour=’9-12,13-15′, jobstore=’mongo’)<span
style=”white-space:pre”>  </span>#
向别名为mongo的jobstore添加job 
def job(): 
        print ‘a job’ 
        time.sleep(1) 
 
sched.start() 
       
注意start必须在添加job动作之后调用,否则会抛错。默认会把job音讯保存在apscheduler数据库下的jobs表:
[plain] www.2cto.com
> 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”) 

        下面就是储存的求实音信。

1. 安装

        安装进度很粗略,可以基于easy_install和源码。

  1. easy_install apscheduler  

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

  1. python setup.py install  

作者:chosen0ne

2. cron job例子

       
APScheduler是进程内的调度器,可以定时触发具体的函数,并且可以访问应用的具备变量和函数。在web应用中经过APScheduler完成定时义务是很有益的。下边看例子:

  1. from apscheduler.scheduler import Scheduler  
  2.   
  3. schedudler = Scheduler(daemonic = False)  
  4.  
  5. @schedudler.cron_schedule(second=’*’, day_of_week=’0-4′, hour=’9-12,13-15′)  
  6. def quote_send_sh_job():  
  7.     print ‘a simple cron job start at’, datetime.datetime.now()  
  8.   
  9. schedudler.start()  

        上边通过装饰器定义了cron
job,能够通过函数scheduler.add_cron_job添加,用装饰器更便宜。Scheduler构造函数中传唱daemonic参数,表示执行线程是非守护的,在Schduler的文档中援引应用非守护线程:

  1. Jobs are always executed in non-daemonic threads.  

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

       
在添加job时还有一个相比主要的参数max_instances,指定一个job的并发实例数,默许值是1。默许情况下,假设一个job准备执行,但是该job的前一个实例尚未履行完,则后一个job会败北,可以经过这一个参数来改变那种气象。

http://www.bkjia.com/Pythonjc/515073.htmlwww.bkjia.comtruehttp://www.bkjia.com/Pythonjc/515073.htmlTechArticleAPScheduler是基于Quartz的一个Python定时任务框架,实现了Quartz的所有功能,使用起来十分方便。提供了基于日期、固定时间间隔以及crontab类型

3. Store

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

 

  1. import pymongo  
  2. from apscheduler.scheduler import Scheduler  
  3. from apscheduler.jobstores.mongodb_store import MongoDBJobStore  
  4. import time  
  5.   
  6. sched = Scheduler(daemonic = False)  
  7.   
  8. mongo = pymongo.Connection(host=’127.0.0.1′, port=27017)  
  9. store = MongoDBJobStore(connection=mongo)  
  10. sched.add_jobstore(store, ‘mongo’)        # 别名是mongo  
  11.  
  12. @sched.cron_schedule(second=’*’, day_of_week=’0-4′, hour=’9-12,13-15′, jobstore=’mongo’)        # 向别名为mongo的jobstore添加job  
  13. def job():  
  14.         print ‘a job’  
  15.         time.sleep(1)  
  16.   
  17. sched.start()  

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

 

  1. > db.jobs.findOne()  
  2. {  
  3.         “_id” : ObjectId(“502202d1443c1557fa8b8d66”),  
  4.         “runs” : 20,  
  5.         “name” : “job”,  
  6.         “misfire_grace_time” : 1,  
  7.         “coalesce” : true,  
  8.         “args” : BinData(0,”gAJdcQEu”),  
  9.         “next_run_time” : ISODate(“2012-08-08T14:10:46Z”),  
  10.         “max_instances” : 1,  
  11.         “max_runs” : null,  
  12.         “trigger” : BinData(0,”gAJjYXBzY2hlZHVsZXIudHJpZ2dlcnMuY3JvbgpDcm9uVHJpZ2dlcgpxASmBcQJ9cQMoVQZmaWVsZHNxBF1xBShjYXBzY2hlZHVsZXIudHJpZ2dlcnMuY3Jvbi5maWVsZHMKQmFzZUZpZWxkCnEGKYFxB31xCChVCmlzX2RlZmF1bHRxCYhVC2V4cHJlc3Npb25zcQpdcQtjYXBzY2hlZHVsZXIudHJpZ2dlcnMuY3Jvbi5leHByZXNzaW9ucwpBbGxFeHByZXNzaW9uCnEMKYFxDX1xDlUEc3RlcHEPTnNiYVUEbmFtZXEQVQR5ZWFycRF1YmgGKYFxEn1xEyhoCYhoCl1xFGgMKYFxFX1xFmgPTnNiYWgQVQVtb250aHEXdWJjYXBzY2hlZHVsZXIudHJpZ2dlcnMuY3Jvbi5maWVsZHMKRGF5T2ZNb250aEZpZWxkCnEYKYFxGX1xGihoCYhoCl1xG2gMKYFxHH1xHWgPTnNiYWgQVQNkYXlxHnViY2Fwc2NoZWR1bGVyLnRyaWdnZXJzLmNyb24uZmllbGRzCldlZWtGaWVsZApxHymBcSB9cSEoaAmIaApdcSJoDCmBcSN9cSRoD05zYmFoEFUEd2Vla3EldWJjYXBzY2hlZHVsZXIudHJpZ2dlcnMuY3Jvbi5maWVsZHMKRGF5T2ZXZWVrRmllbGQKcSYpgXEnfXEoKGgJiWgKXXEpY2Fwc2NoZWR1bGVyLnRyaWdnZXJzLmNyb24uZXhwcmVzc2lvbnMKUmFuZ2VFeHByZXNzaW9uCnEqKYFxK31xLChoD05VBGxhc3RxLUsEVQVmaXJzdHEuSwB1YmFoEFULZGF5X29mX3dlZWtxL3ViaAYpgXEwfXExKGgJiWgKXXEyKGgqKYFxM31xNChoD05oLUsMaC5LCXViaCopgXE1fXE2KGgPTmgtSw9oLksNdWJlaBBVBGhvdXJxN3ViaAYpgXE4fXE5KGgJiGgKXXE6aAwpgXE7fXE8aA9Oc2JhaBBVBm1pbnV0ZXE9dWJoBimBcT59cT8oaAmJaApdcUBoDCmBcUF9cUJoD05zYmFoEFUGc2Vjb25kcUN1YmVVCnN0YXJ0X2RhdGVxRE51Yi4=”),  
  13.         “func_ref” : “__main__:job”,  
  14.         “kwargs” : BinData(0,”gAJ9cQEu”)  
  15. }  

        上边就是储存的有血有肉音信。

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()可以打印出万分堆栈音讯。

 

  1. def err_listener(ev):  
  2.     err_logger = logging.getLogger(‘schedErrJob’)  
  3.     if ev.exception:  
  4.         err_logger.exception(‘%s error.’, str(ev.job))  
  5.     else:  
  6.         err_logger.info(‘%s miss’, str(ev.job))  
  7.   
  8. 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才方可。可以因而命令已毕关闭脚本:

 

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

 

相关文章