Python定期职责框架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  

 

相关文章