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和源码。
- easy_install apscheduler
或者下载源码,运行命令:
- python setup.py install
作者:chosen0ne
2. cron job例子
APScheduler是进程内的调度器,可以定时触发具体的函数,并且可以访问应用的具备变量和函数。在web应用中经过APScheduler完成定时义务是很有益的。下边看例子:
- 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的文档中援引应用非守护线程:
- Jobs are always executed in non-daemonic threads.
具体cron
job的陈设参看doc,基本上与Quartz一致。
在添加job时还有一个相比主要的参数max_instances,指定一个job的并发实例数,默许值是1。默许情况下,假设一个job准备执行,但是该job的前一个实例尚未履行完,则后一个job会败北,可以经过这一个参数来改变那种气象。
3. Store
APScheduler提供了jobstore用于存储job的执行音信,默许使用的是RAMJobStore,还提供了
SQLAlchemyJobStore、ShelveJobStore和MongoDBJobStore。APScheduler允许同时采纳三个jobstore,通过别名(alias)区分,在添加job时要求指定具体的jobstore的别名,否则使用的是别名是default的
jobstore,即RAMJobStore。下边以MongoDBJobStore举例表明。
- 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’) # 别名是mongo
- @sched.cron_schedule(second=’*’, day_of_week=’0-4′, hour=’9-12,13-15′, jobstore=’mongo’) # 向别名为mongo的jobstore添加job
- def job():
- print ‘a job’
- time.sleep(1)
- sched.start()
注意start必须在添加job动作之后调用,否则会抛错。默许会把job音讯保存在apscheduler数据库下的jobs表:
- > 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”)
- }
上边就是储存的有血有肉音信。
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()可以打印出万分堆栈音讯。
- def err_listener(ev):
- err_logger = logging.getLogger(‘schedErrJob’)
- if ev.exception:
- err_logger.exception(‘%s error.’, str(ev.job))
- else:
- err_logger.info(‘%s miss’, str(ev.job))
- schedudler.add_listener(err_listener, apscheduler.events.EVENT_JOB_ERROR | apscheduler.events.EVENT_JOB_MISSED)
事件的特性蕴含:
|
最终,须要留意一点当job不以daemon方式运行时,并且APScheduler也不是daemon的,那么在关闭脚本时,Ctrl
- C是不见效的,必须kill才方可。可以因而命令已毕关闭脚本:
ps axu | grep {脚本名} | grep -v grep | awk '{print $2;}' | xargs kill