測試平臺系列(72) 瞭解ApScheduler基本用法

米洛丶發表於2021-11-05

大家好~我是米洛

我正在從0到1打造一個開源的介面測試平臺, 也在編寫一套與之對應的完整教程,希望大家多多支援。

歡迎關注我的公眾號測試開發坑貨,獲取最新文章教程!

回顧

上一節我們調研了一下市面上的定時任務方案,最終確定為APScheduler,但據說在uvicorn下還有一些坑。

沒關係,筆者也是在摸索階段。如果有遇到問題,解決了也可以給大家參考。

這篇主要給大家介紹一下APScheduler的基本資訊和使用方法。

四個名詞

官網講的很詳細

  • 觸發器: 定時任務什麼時候觸發
  • 工作商店: 定時任務存在哪裡,記憶體?MySQL?Redis?
  • 執行器: 執行任務的程式
  • 排程程式: 不同任務之間的排程管理程式,還包括任務的新增和修改等

儲存介質

上一節我們提到了定時任務持久化。

那麼在APScheduler中支援哪些儲存介質呢?看一張圖:

圖中很詳細

可以看到,它支援多種介質,包括我們最不願意用的memory(記憶體)。因為如果服務重啟,資料就都沒了,所以我們不考慮使用這個。

  • SQLAlchemy

    這是我們常用的方法,通過它可以寫入到mysql,在不引入其他元件的情況下完全可以考慮。

  • MongoDB

    NoSQL的一種,比較方便,我們秉著不額外增加元件的信念,暫不考慮。

  • Redis

    redis後續我們自身服務也需要用到,但把它作為一個"資料庫"來使用,還得考慮redis備份等情況,當然優點就是會比mysql更快。

    至於其他的zk,rethinkdb,由於我們暫時也不會引用,所以不分析了。

    綜合而言,還是用SQLAlchemy代價最小,成本最低。

執行模式

在執行demo的過程中,發現APScheduler很強大,可以支援各種併發模式。

採用谷歌翻譯 翻譯了一下,現在的翻譯軟體都很好用了

由於我們是非同步Asycio,所以我們選擇第三種執行器。其他的包括Gevent等也是Flask/Django等框架的好選擇。

瞭解基本API

  • 配置scheduler
from apscheduler.jobstores.sqlalchemy import SQLAlchemyJobStore
from apscheduler.schedulers.asyncio import AsyncIOScheduler

# 選擇job儲存介質為sqlalchemy
job_store = {
    'default': SQLAlchemyJobStore(url=Config.SQLALCHEMY_DATABASE_URI)
}
# 選擇排程程式為AsyncIOScheduler
scheduler = AsyncIOScheduler()
# 配置好對應的程式
scheduler.configure(jobstores=job_store)
# 啟動
scheduler.start()
  • 新增job
# 把方法: myfunc新增到定時任務,每2分鐘執行一次
scheduler.add_job(myfunc, 'interval', minutes=2, id='my_job_id')

與pity結合

在FastApi中,有個startup的鉤子方法,意味著當服務啟動的時候會自動執行該方法。我們來看看怎麼用的:

@pity.on_event意思是監聽事件,後面的引數: "startup"代表pity服務啟動。

也就是說,當pity啟動的時候,則初始化Scheduler。

這裡我封裝了一個Scheduler類,後面會給大家介紹裡面的具體方法。

下一節我們編寫測試計劃相關介面,並與APScheduler結合起來,完成一整套定時任務功能。

相關文章