欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Python定时任务框架APScheduler

程序员文章站 2024-03-30 19:32:03
 apscheduler是基于quartz的一个python定时任务框架,实现了quartz的所有功能,使用起来十分方便。提供了基于日期、固定时间间隔以及crontab类...
 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") 

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

作者:chosen0ne