yanfangsheng123 发表于 2017-5-7 08:28:41

强大的python 定时任务框架 APScheduler 类似java的Quartz

  http://blog.sina.com.cn/s/blog_9f2dd2f301014rrv.html
  APScheduler是基于Quartz的 一个Python定时任务框架,实现了Quartz的所有功能,使用起来十分方便。提供了基于日期、固定时间间隔以及crontab类型的任务,并且可以 持久化任务。基于这些功能,我们可以很方便的实现一个python定时任务系统,写python还是要比java舒服多了。
  安装过程很简单,可以基于easy_install和源码。
   view plaincopyprint?
  easy_install apscheduler  
  或者下载源码,运行命令:
   view plaincopyprint?
  python setup.py install  
  APScheduler是进程内的调度器,可以定时触发具体的函数,并且可以访问应用的所有变量和函数。在web应用中通过APScheduler实现定时任务是很方便的。下面看例子:
   view plaincopyprint?
  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的文档中推荐使用非守护线程:
   view plaincopyprint?
  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举例说明。
   view plaincopyprint?
  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表:
   view plaincopyprint?
  > 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]
查看完整版本: 强大的python 定时任务框架 APScheduler 类似java的Quartz