APScheduler是一个Python定时任务框架,使用起来十分方便.提供了基于日期,时间,固定时间间隔以及crontab类型的任务,而且能够持久化任务,并以daemon方式运行运用.python
APScheduler提供了许多不一样的方式来配置调度器,你可使用一个配置字典或者做为参数关键字的方式传入,你也能够先建立调度器,在配置和添加做业,这样你能够在不一样的环境中获得更大的灵活性.git
实例
下面是一个简单使用BlockingScheduler,使用默认内存存储和默认执行器(默认选项分别是MemoryJobStore和ThreadPoolExecutor,其中线程池的最大线程数为10),配置完成后使用start()方法来启动.
```
from apscheduler.schedulers.blocking import BlockingSchedulermongodb
def my_job():
print 'hello world'数据库
sched = BlockingScheduler()
sched.add_job(my_job, 'interval', seconds=5)
sched.start()
```
在运行程序5秒后,将会输出第一个Hello world.
下面进行一个更复杂的配置,使用两个做业存储和两个调度器.在这个配置中,做业将使用mongo做业存储,信息写入到MongoDB中.express
from pymongo import MongoClient from apscheduler.schedulers.blocking import BlockingScheduler from apscheduler.jobstores.mongodb import MongoDBJobStore from apscheduler.jobstores.memory import MemoryJobStore from apscheduler.executors.pool import ThreadPoolExecutor, ProcessPoolExecutor def my_job(): print 'hello world' host = '127.0.0.1' port = 27017 client = MongoClient(host, port) jobstores = { 'mongo': MongoDBJobStore(collection='job', database='test', client=client), 'default': MemoryJobStore() } executors = { 'default': ThreadPoolExecutor(10), 'processpool': ProcessPoolExecutor(3) } job_defaults = { 'coalesce': False, 'max_instances': 3 } scheduler = BlockingScheduler(jobstores=jobstores, executors=executors, job_defaults=job_defaults) scheduler.add_job(my_job, 'interval', seconds=5) try: scheduler.start() except SystemExit: client.close()
查看MongoDB能够看到做业的运行状况以下:
{ "_id" : "55ca54ee4bb744f8a5ab08cc4319bc24", "next_run_time" : 1434017278.797, "job_state" : new BinData(0, "gAJ9cQEoVQRhcmdzcQIpVQhleGVjdXRvcnEDVQdkZWZhdWx0cQRVDW1heF9pbnN0YW5jZXNxBUsDVQRmdW5jcQZVD19fbWFpbl9fOm15X2pvYnEHVQJpZHEIVSA1NWNhNTRlZTRiYjc0NGY4YTVhYjA4Y2M0MzE5YmMyNHEJVQ1uZXh0X3J1bl90aW1lcQpjZGF0ZXRpbWUKZGF0ZXRpbWUKcQtVCgffBgsSBzoMKUhjcHl0egpfcApxDChVDUFzaWEvU2hhbmdoYWlxDU2AcEsAVQNDU1RxDnRScQ+GUnEQVQRuYW1lcRFVBm15X2pvYnESVRJtaXNmaXJlX2dyYWNlX3RpbWVxE0sBVQd0cmlnZ2VycRRjYXBzY2hlZHVsZXIudHJpZ2dlcnMuaW50ZXJ2YWwKSW50ZXJ2YWxUcmlnZ2VyCnEVKYFxFn1xF1UPaW50ZXJ2YWxfbGVuZ3RocRhHQBQAAAAAAABzfXEZKFUIdGltZXpvbmVxGmgMKGgNTehxSwBVA0xNVHEbdFJxHFUIaW50ZXJ2YWxxHWNkYXRldGltZQp0aW1lZGVsdGEKcR5LAEsFSwCHUnEfVQpzdGFydF9kYXRlcSBoC1UKB98GCxIHIQwpSGgPhlJxIVUIZW5kX2RhdGVxIk51hmJVCGNvYWxlc2NlcSOJVQd2ZXJzaW9ucSRLAVUGa3dhcmdzcSV9cSZ1Lg==") }
框架
@sched.scheduled_job('cron', id='my_job_id', day='last sun') def some_decorated_task(): print("I am printed at 00:00:00 on the last Sunday of every month!")
移除做业
```
job = scheduler.add_job(myfunc, 'interval', minutes=2)
job.remove()
Same, using an explicit job ID:函数
apscheduler.schedulers.base.BaseScheduler.pause_job()
apscheduler.job.Job.resume()
apscheduler.schedulers.base.BaseScheduler.resume_job()
get_jobs()
来完成,它会返回全部的job实例.或者使用print_jobs()
来输出全部格式化的做业列表.def some_decorated_task(): print("I am printed at 00:00:00 on the last Sunday of every month!")
关闭调度器
默认状况下调度器会等待全部正在运行的做业完成后,关闭全部的调度器和做业存储.若是你不想等待,能够将wait选项设置为False
scheduler.shutdown() scheduler.shutdown(wait=False)
线程
add_job的第二个参数是trigger,它管理着做业调度方式,它能够为date,interval或者cron.3d
year (int|str)
4-digit yearmonth (int|str)
month(1-12)day (int|str)
day of the (1-31)week (int|str)
ISO week(1-53)day_of_week (int|str)
number or name of weekday (0-6 or mon,tue,wed,thu,fri,sat,sun)hour (int|str)
hour(0-23)minute (int|str)
minute(0-59)second (int|str)
second(0-59)start_date (datetime|str)
earliest possible date/time to trigger on (inclusive)end_date (datetime|str)
– latest possible date/time to trigger on (inclusive)timezone (datetime.tzinfo|str)
– time zone to use for the date/time calculations (defaults to scheduler timezone)和Linux的crontab同样,它的值格式为:
code
Expression | Field | Description |
---|---|---|
* | any | Fire on every value |
*/a | any | Fire every a values, starting from the minimum |
a-b | any | Fire on any value within the a-b range (a must be smaller than b) |
a-b/c | any | Fire every c values within the a-b range |
xth y | day | Fire on the x -th occurrence of weekday y within the month |
last x | day | Fire on the last occurrence of weekday x within the month |
last | day | Fire on the last day within the month |
x,y,z | any | Fire on any matching expression; can combine any number of any of the above expressions |
# Schedules job_function to be run on the third Friday # of June, July, August, November and December at 00:00, 01:00, 02:00 and 03:00 sched.add_job(job_function, 'cron', month='6-8,11-12', day='3rd fri', hour='0-3') # Runs from Monday to Friday at 5:30 (am) until 2014-05-30 00:00:00 sched.add_job(job_function, 'cron', day_of_week='mon-fri', hour=5, minute=30, end_date='2014-05-30')
weeks (int)
– number of weeks to waitdays (int)
– number of days to waithours (int)
– number of hours to waitminutes (int)
– number of minutes to waitseconds (int)
– number of seconds to waitstart_date (datetime|str)
– starting point for the interval calculationend_date (datetime|str)
– latest possible date/time to trigger ontimezone (datetime.tzinfo|str)
– time zone to use for the date/time calculations# Schedule job_function to be called every two hours sched.add_job(job_function, 'interval', hours=2)
run_date (datetime|str)
– the date/time to run the job attimezone (datetime.tzinfo|str)
– time zone for run_date if it doesn’t have one already# The job will be executed on November 6th, 2009 sched.add_job(my_job, 'date', run_date=date(2009, 11, 6), args=['text']) # The job will be executed on November 6th, 2009 at 16:30:05 sched.add_job(my_job, 'date', run_date=datetime(2009, 11, 6, 16, 30, 5), args=['text'])