Python定时任务框架APScheduler
程序员文章站
2023-11-01 20:37:28
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
安装过程很简单,可以基于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
上一篇: python实现tee命令
下一篇: python实现tee命令