網站首頁 編程語言 正文
使用背景
實際項目中,需要驗證打點數據在各個系統中收集是否一致,而部分節點打點數據收集是通過異步任務實現的,等待時間比較久。為應對業務異步操作處理,實現異步數據的收集,經過調研后,選擇了 APScheduler 框架。
什么是 APScheduler 框架?
APScheduler 是基于 Quartz(一個功能豐富的開源任務調度系統) 的一個 Python 定時任務框架,使用起來簡單且方便,提供了基于日期、固定時間間隔以及 crontab 類型的任務,并且可以持久化任務,基于這些功能可以快速實現 python 的定時輪詢任務系統。
使用 APScheduler 框架,可以通過 pip 安裝
pip install apscheduler
APScheduler 框架包含四個組成部分
觸發器 (trigger)觸發器包含調度邏輯,每一個作業有它自己的觸發器,用于決定接下來哪一個作業會運行;除了他們自己初始的配置,觸發器本身是無狀態的。
作業存儲 (job store)作業存儲存儲被調度的作業,默認的作業存儲是簡單的將作業保存到內存中,如果選擇其他方式也可以將作業保存到數據庫中;一個作業數據的保存將會在持久化作業存儲的時候被序列化,然后在加載時被反序列化;調度器無法分享同一個作業存儲。
執行器 (executor)執行器處理作業的運行,一般通過在作業中提交制定好的可調用對象到一個線程中或者線程池中來執行;在作業完成時,執行器會去通知調度器。
調度器 (scheduler)調度器是 APScheduler 的核心,所有相關的組件都要通過它來定義,已配置好的任務也是要通過它來調度。
APScheduler 在 flask 中使用
因為 scheduler 任務需要耗費較多時間,因此當在項目中收到 flask 的接口請求后,可以通過線程異步處理耗時任務,先將 “正在處理” 作為接口結果返回,
示例代碼結構如下:
編寫任務函數,開始 APScheduler 的調度
在通過 flask 接口拿到需要的任務參數后,便可以創建調度任務。在創建調度任務之前,我們需要確定要選擇哪一種調度器、job 存儲、執行器和觸發器,
調度器的選擇主要基于編程環境以及 APScheduler 的用途,
這里我們根據需要選擇 BackgroundScheduler。
在 job 存儲的選擇上,需要根據自己的 job 是否需要持久化,因為沒有特殊的需求,所以使用默認的內存方式
執行器的選擇需要依據 job 的類型,默認的線程池執行器apscheduler.executors.pool.ThreadPoolExecutor 已經可以滿足大多數情況。
管理 job 的調度方式需要選擇一個合適的觸發器,APScheduler 內置三種觸發器;
因為我們的自動化需要對各個子環節進行驗證,當上一個環節成功后才能進行下一個環節的驗證,因此選擇 apscheduler.triggers.interval,以固定的時間間隔運行 job。
部分項目代碼
periodic_task 是項目中的任務調度函數;首先實例化了一個 BackgroundScheduler 調度器,接著向調度器添加 job,添加的 job 為 data_task 函數,同時定義了 job 的觸發器,指定固定的時間間隔為 58 秒。
其中 data_task 描述了具體的 job 細節,即分別判斷當前不同的任務節點執行相應的驗證過程,并將每一步的驗證狀態記錄到數據庫中,這樣在下一次執行 data_task 時,就可以去校驗新的環節;
啟動調度器使用 start 函數,結束調度器使用 shutdown 函數;
shutdown 函數可以指定停止條件,在本項目中,因為步驟比較多,一旦有環節出錯,就需要結束任務,保存已驗證的環節,因此在拿到任務結果時,不論是整個驗證成功的結果,還是某個環節出錯的結果,都會停止本次調度,結束掉本次驗證。
總結
- APScheduler 在 flask 中使用需要用到線程池異步去處理耗時任務;
- 使用 APScheduler 需要配置好合適的調度器、job 存儲、執行器和觸發器;
- 在業務中驗證復雜連續的步驟可以使用輪詢的方式,并設置好任務結束的條件,不僅可以校驗每一步的驗證結果而且有環節出錯也不影響整個流程。
原文鏈接:https://testerhome.com/articles/33796
相關推薦
- 2022-08-27 C++中Boost的智能指針weak_ptr_C 語言
- 2023-01-11 openCV-Python筆記之解讀圖像的讀取、顯示和保存問題_python
- 2022-04-09 idea解決sun.misc.BASE64Encoder 類找不到報錯
- 2022-03-11 Golang如何讀取單行超長的文本詳解_Golang
- 2022-06-06 python?利用?PrettyTable?美化表格_python
- 2022-08-12 Python中深拷貝與淺拷貝的區別介紹_python
- 2022-09-03 Go語言函數的延遲調用(Deferred?Code)詳解_Golang
- 2022-04-21 C語言中結構體實例解析_C 語言
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支