pip install apscheduler
觸發器中包含調度邏輯,每一個做業都由本身的觸發器來決定下次運行時間。除了他們本身初始配置意外,觸發器徹底是無狀態的。html
# 每兩個小時調一下job_function sched.add_job(job_function, 'interval', hours=2)
(int|str) 表示參數既能夠是int類型,也能夠是str類型
(datetime | str) 表示參數既能夠是datetime類型,也能夠是str類型python
參數的取值格式:react
Expressiongit |
Fieldweb |
Descriptionredis |
*sql |
anymongodb |
Fire on every value數據庫 |
*/aexpress |
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 |
#表示2017年3月22日17時19分07秒執行該程序 sched.add_job(my_job, 'cron', year=2017,month = 03,day = 22,hour = 17,minute = 19,second = 07) #表示任務在6,7,8,11,12月份的第三個星期五的00:00,01:00,02:00,03:00 執行該程序 sched.add_job(my_job, 'cron', month='6-8,11-12', day='3rd fri', hour='0-3') #表示從星期一到星期五5:30(AM)直到2014-05-30 00:00:00 sched.add_job(my_job(), 'cron', day_of_week='mon-fri', hour=5, minute=30,end_date='2014-05-30') #表示每5秒執行該程序一次,至關於interval 間隔調度中seconds = 5 sched.add_job(my_job, 'cron',second = '*/5')
run_date (datetime|
str
) – the date
/
time to run the job at
-
(任務開始的時間)
timezone (datetime.tzinfo|
str
) – time zone
for
run_date
if
it doesn’t have one already
#在指定的時間,只執行一次 scheduler.add_job(tick, 'date', run_date='2016-02-14 15:01:05') # 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'])
存儲被調度的做業,默認的做業存儲器只是簡單地把做業保存在內存中,其餘的做業存儲器則是將做業保存在數據庫中。看成業被保存到一個持久化的做業存儲器中的時候,該做業的數據會被序列化,並在加載時被反序列化。做業存儲器不能共享調度器。
jobstore提供給scheduler一個序列化jobs的統一抽象,提供對scheduler中job的增刪改查接口,根據存儲backend的不一樣,分如下幾種:
處理做業的運行,他們一般經過在做業中提交指定的可調用對象到一個線程或者進城池來進行。看成業完成時,執行器將會通知調度器。
配置做業存儲器和執行器能夠在調度器中完成,例如添加、修改和移除做業。根據不一樣的應用場景能夠選用不一樣的調度器。
可選的有BlockingScheduler、BackgroundScheduler、AsyncIOScheduler、GeventScheduler、TornadoScheduler、TwistedScheduler、QtScheduler 7種。
簡單實例
import time from apscheduler.schedulers.blocking import BlockingScheduler def test_job(): print time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())) scheduler = BlockingScheduler() #該示例代碼生成了一個BlockingScheduler調度器,使用了默認的默認的任務存儲MemoryJobStore,以及默認的執行器ThreadPoolExecutor,而且最大線程數爲10。 scheduler.add_job(test_job, 'interval', seconds=5, id='test_job') #該示例中的定時任務採用固定時間間隔(interval)的方式,每隔5秒鐘執行一次。 #而且還爲該任務設置了一個任務id scheduler.start()
若是想執行一些複雜任務,如上邊所說的同時使用兩種執行器,或者使用多種任務存儲方式,而且須要根據具體狀況對任務的一些默認參數進行調整。能夠參考下面的方式。
(http://apscheduler.readthedocs.io/en/latest/userguide.html)
from pytz import utc from apscheduler.schedulers.background import BackgroundScheduler # 導入調度器 from apscheduler.jobstores.mongodb import MongoDBJobStore # 導入做業存儲 from apscheduler.jobstores.sqlalchemy import SQLAlchemyJobStore # 導入做業存儲 from apscheduler.executors.pool import ThreadPoolExecutor, ProcessPoolExecutor # 導入執行器 jobstores = { 'mongo': MongoDBJobStore(), 'default': SQLAlchemyJobStore(url='sqlite:///jobs.sqlite') } executors = { 'default': ThreadPoolExecutor(20), 'processpool': ProcessPoolExecutor(5) } job_defaults = { 'coalesce': False, 'max_instances': 3 } scheduler = BackgroundScheduler(jobstores=jobstores, executors=executors, job_defaults=job_defaults, timezone=utc)
from apscheduler.schedulers.background import BackgroundScheduler # The "apscheduler." prefix is hard coded scheduler = BackgroundScheduler({ 'apscheduler.jobstores.mongo': { 'type': 'mongodb' }, 'apscheduler.jobstores.default': { 'type': 'sqlalchemy', 'url': 'sqlite:///jobs.sqlite' }, 'apscheduler.executors.default': { 'class': 'apscheduler.executors.pool:ThreadPoolExecutor', 'max_workers': '20' }, 'apscheduler.executors.processpool': { 'type': 'processpool', 'max_workers': '5' }, 'apscheduler.job_defaults.coalesce': 'false', 'apscheduler.job_defaults.max_instances': '3', 'apscheduler.timezone': 'UTC', })
from pytz import utc from apscheduler.schedulers.background import BackgroundScheduler from apscheduler.jobstores.sqlalchemy import SQLAlchemyJobStore from apscheduler.executors.pool import ProcessPoolExecutor jobstores = { 'mongo': {'type': 'mongodb'}, 'default': SQLAlchemyJobStore(url='sqlite:///jobs.sqlite') } executors = { 'default': {'type': 'threadpool', 'max_workers': 20}, 'processpool': ProcessPoolExecutor(max_workers=5) } job_defaults = { 'coalesce': False, 'max_instances': 3 } scheduler = BackgroundScheduler() # .. do something else here, maybe add jobs etc. scheduler.configure(jobstores=jobstores, executors=executors, job_defaults=job_defaults, timezone=utc)