1虑乖,APScheduler是什么?
- APScheduler (advanceded python scheduler)是一款Python開發(fā)的定時任務工具晾虑。用戶指南 https://apscheduler.readthedocs.io/en/latest/userguide.html#starting-the-scheduler
- APScheduler有四種組件:調度器Scheduler疹味、執(zhí)行器executors、添加定時任務. add_job帜篇、觸發(fā)器Tigger
2糙捺,APScheduler的使用場景?
- redis持久化存儲時笙隙,使用APScheduler洪灯,使數(shù)據(jù)同步。
- 用戶下單后使用竟痰,規(guī)定30min內必須支付签钩,否則取消訂單掏呼。
3,APScheduler 與 crontab 同為定時任務工具边臼,有什么區(qū)別哄尔?
crontab:
- crontab是Linux系統(tǒng)提供的一個命令假消,用來完成定時任務
- 使用django-crontab 擴展 封裝了Linux提供的crontab 命令
- 可以獨立于程序之外柠并,不會占用程序資源,耦合性低
- 但是它不靈活富拗,比如上面那個訂單支付問題臼予,crontab不知道要什么時候執(zhí)行,所以它做不到
APScheduler:
- 可以獨立運行啃沪,也可以放在程序(如Django粘拾、Flask)中。
- 靈活创千,可以在程序開始前開啟定時任務缰雇,也可以執(zhí)行到某個任務時,立即可開啟定時任務追驴。
- 如果依賴程序的話械哟,會占用程序資源
APScheduler如何使用?
1殿雪,安裝
pip install apscheduler
2 使用方式
from apscheduler.schedulers.background import BackgroundScheduler
# 創(chuàng)建定時任務的調度器對象
scheduler = BackgroundScheduler()
# 定義定時任務
def my_job(param1, param2):
pass
# 向調度器中添加定時任務
scheduler.add_job(my_job, 'date', args=[100, 'python'])
# 啟動定時任務調度器工作
scheduler.start()
3暇咆,調度器Scheduler
- 獨立運行時使用BlockingScheduler
from apscheduler.schedulers.blocking import BlockingScheduler
scheduler = BlockingScheduler()
scheduler.start() # 此處程序會發(fā)生阻塞
- 在框架程序(如Django、Flask)中使用BackgroundScheduler:
from apscheduler.schedulers.background import BackgroundScheduler
scheduler = BackgroundScheduler()
scheduler.start() # 此處程序不會發(fā)生阻塞
4丙曙,執(zhí)行器 executors 可以使用線程池(ThreadPoolExecutor)和進程池(ProcessPoolExecutor)
- 線程程池
from apscheduler.executors.pool import ThreadPoolExecutor
ThreadPoolExecutor(max_workers)
ThreadPoolExecutor(20) # 最多20個線程同時執(zhí)行
使用方法:
executors = {
'default': ThreadPoolExecutor(20)
}
scheduler = BackgroundScheduler(executors=executors)
- 進程池
from apscheduler.executors.pool import ProcessPoolExecutor
ProcessPoolExecutor(max_workers)
ProcessPoolExecutor(5) # 最多5個進程同時執(zhí)行
使用方法:
executors = {
'default': ProcessPoolExecutor(3)
}
scheduler = BackgroundScheduler(executors=executors)
5爸业,觸發(fā)器Tigger
- 執(zhí)行任務的時間安排:
data :在特定的時間執(zhí)行
interval:按指定的時間間隔執(zhí)行
weeks (int) – number of weeks to wait
days (int) – number of days to wait
hours (int) – number of hours to wait
minutes (int) – number of minutes to wait
seconds (int) – number of seconds to wait
start_date (datetime|str) – starting point for the interval calculation
end_date (datetime|str) – latest possible date/time to trigger on
timezone (datetime.tzinfo|str) – time zone to use for the date/time calculations
cron:按指定的周期執(zhí)行
year (int|str) – 4-digit year
month (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)
t>imezone (datetime.tzinfo|str) – time zone to use for the date/time calculations (defaults to scheduler timezone)
- 例:
# 每天0點執(zhí)行函數(shù)的代碼,0點的話,hour可以不用寫
app.scheduler.add_job(函數(shù)名, "cron", hour=0, args=[函數(shù)需要傳的參數(shù)])
#每天凌晨3點執(zhí)行代碼
app.scheduler.add_job(函數(shù)名, "cron", hour=3, args=[app])
#如果date后面沒有參數(shù)的話亏镰,就是立刻執(zhí)行代碼扯旷,一般測試的時候用
app.scheduler.add_job(函數(shù)名, "date", args=[app])
6,程序運行:
scheduler.start()
7,停止APScheduler運行
scheduler.shutdown()