https://apscheduler.readthedocs.io/en/latest/userguide.html
簡單的使用方式為:
from apscheduler.schedulers.blocking import BlockingScheduler
sched = BlockingScheduler()
sched.add_job(ff_task,'cron',hour='0-1,8-23',minute=28)
sched.add_job(avor_task, 'cron', hour='2-7', minute='0')
sched.add_job(vor_task,'cron',hour='0-1,8-23',minute='*/3')
try:
sched.start()
except (KeyboardInterrupt, SystemExit):
sched.shutdown()
apscheduler包含四個組件 :triggers觸發器 , schedulers 調度器 ,job stores任務存儲 , executors執行器
triggers 包含計划的邏輯,每個任務都有自己的觸發器,來決定任務下次被觸發的時間,除了類型的初始配置,觸發器是完全無狀態的
job stores 用戶存儲被計划的任務,默認存儲在內存中,也可存儲在各種數據庫中。當一個任務被存儲在持久化的存儲庫中時將被序列化,然后在加載到內存時被反序列化。
調度器之間不應該共用任務存儲。
executors 用於處理任務的執行。 讓預定的任務在線程或進程池中啟動,當任務結束后,執行器通知調度器什么時候進行合適的事件。
scheduler用於將所有的組建凝結起來。一個應用中通常只有一個調度器
BlockingScheduler:用於當scheduler是進程里唯一運行的程序
BlockgroundScheduler:當你沒有使用以下任何一個調度器,並且希望scheduler在應用的后台運行時適用
AsyncIOScheduler :當應用中使用 asyncio module(異步io模塊)時適用
GeventScheduler :當應用中使用 gevent時適用
TornadoScheduler :當構建基於Tornado的應用時適用
TwistedScheduler: 當構建基於 TwistedScheduler的應用時適用
QtScheduler: 當構建 Qt 應用時適用
存儲器選擇
如果每次開啟應用時都會重建任務計划,則可以使用默認的內存存儲
如果你希望當scheduler重啟或應用宕機時,任務可以繼續的按計划執行 ,存儲器的選擇通常取決於開發環境中使用的工具。
如果你沒什么要求則推薦使用SQLAlchemyJobStore,以PostgreSQL作為存儲后端
執行器
通常取決於上述組建的選擇,不過,通常默認的執行器 ThreadPoolExecutor也足夠大多數任務了。如果任務中設計了cpu密集型操作,應該考慮ProcessPoolExecutor ,來使用多核CPU。
你甚至可以同時使用這兩個執行器,將進程池執行器添加為備選執行器
觸發器
trigger決定任務執行時間的邏輯。ASPcheduler內置三種觸發器:
date : 一次性的固定時間點執行任務
interval: 按周期循環執行任務
cron: 語法類似linux的定時任務cron
要組合多種triggers,也可實現 ,combining triggers ,見 https://apscheduler.readthedocs.io/en/latest/modules/triggers/combining.html#module-apscheduler.triggers.combining
ASPchedulre提供多種配置方式 ,可以通過一個配置的dict或者作為可選關鍵字參數傳入。或者也可先實例化scheduler,添加任務,然后再配置scheduler,這種方式取得最大的靈活性。
完整的而配置說明見 https://apscheduler.readthedocs.io/en/latest/modules/schedulers/base.html#apscheduler.schedulers.base.BaseScheduler
例如,選用BackgroundScheduler ,使用默認的job store 和默認的executor:
from apscheduler.schedulers.background import BackgroundScheduler
scheduler=BackgroundScheduler()
這將會用名為”default"的MemoryJobStore ,名為“default"的ThreadPoolExecutor,默認線程池最大量為10的配置創建一個 BackgroundScheduler 。
例1
from pytz import utc
from apscheduler.schedulers.background import BackgroundScheduler
from apscheduler.jobstores.mongodb import MongoDBJobStore
from apscheduler.executors.pool import ThreadPoolExecutor,ProcessPoolExecutor
jobstores={
'mongo':MongoDBJobStore(),
'default':SQLAlchemyJobStore(url='sqlite://jobs.sqlite')
}
executors={
'default':ThreadPoolExecutor(20),
'processpool':ProcessPoolExector(5)
}
job_defaults={
'coalesce':False,
'max_instances';3
}
scheduler=BackgroundScheduler(jonstores=jobstores,executors=executors,job_defaults,timezone=utc)
例2
from apsshceduler.schedulers.background import BackgroundScheduler
scheduler=BackgroundScheduler({
'apscheduler.jonstores.mongo':{
'type':'mongodb'
},
'apscheduler.jobstores.default':{
'type':'sqlalchemy',
'url':'sqlite:///jobs.sqlite'
},
'apscheduler.executors.default':{
'class':'apscheduler.executors.pool:ThreadExecutor',
'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',
}
)
例3
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()
scheduler,configure(jobstores=jobstores,executors=executors,job_defaults=job_defaults,timezone=utc)