大家好~我是
米洛
!
我正在從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結合起來,完成一整套定時任務功能。