定時任務(wù)APScheduler,隨時可以保持數(shù)據(jù)同步

1,APScheduler是什么?

2,APScheduler的使用場景?

  • redis持久化存儲時,使用APScheduler,使數(shù)據(jù)同步。
  • 用戶下單后使用,規(guī)定30min內(nèi)必須支付,否則取消訂單。

3,APScheduler 與 crontab 同為定時任務(wù)工具,有什么區(qū)別?

crontab:

  • crontab是Linux系統(tǒng)提供的一個命令,用來完成定時任務(wù)
  • 使用django-crontab 擴展 封裝了Linux提供的crontab 命令
  • 可以獨立于程序之外,不會占用程序資源,耦合性低
  • 但是它不靈活,比如上面那個訂單支付問題,crontab不知道要什么時候執(zhí)行,所以它做不到

APScheduler:

  • 可以獨立運行,也可以放在程序(如Django、Flask)中。
  • 靈活,可以在程序開始前開啟定時任務(wù),也可以執(zhí)行到某個任務(wù)時,立即可開啟定時任務(wù)。
  • 如果依賴程序的話,會占用程序資源

APScheduler如何使用?

1,安裝
pip install apscheduler
2 使用方式
from apscheduler.schedulers.background import BackgroundScheduler

# 創(chuàng)建定時任務(wù)的調(diào)度器對象
scheduler = BackgroundScheduler()

# 定義定時任務(wù)
def my_job(param1, param2):
    pass

# 向調(diào)度器中添加定時任務(wù)
scheduler.add_job(my_job, 'date', args=[100, 'python'])

# 啟動定時任務(wù)調(diào)度器工作
scheduler.start()
3,調(diào)度器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í)行任務(wù)的時間安排:

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()
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容