python自動(dòng)化測(cè)試中APScheduler?Flask的應(yīng)用示例
使用背景
實(shí)際項(xiàng)目中,需要驗(yàn)證打點(diǎn)數(shù)據(jù)在各個(gè)系統(tǒng)中收集是否一致,而部分節(jié)點(diǎn)打點(diǎn)數(shù)據(jù)收集是通過(guò)異步任務(wù)實(shí)現(xiàn)的,等待時(shí)間比較久。為應(yīng)對(duì)業(yè)務(wù)異步操作處理,實(shí)現(xiàn)異步數(shù)據(jù)的收集,經(jīng)過(guò)調(diào)研后,選擇了 APScheduler 框架。
什么是 APScheduler 框架?
APScheduler 是基于 Quartz(一個(gè)功能豐富的開(kāi)源任務(wù)調(diào)度系統(tǒng)) 的一個(gè) Python 定時(shí)任務(wù)框架,使用起來(lái)簡(jiǎn)單且方便,提供了基于日期、固定時(shí)間間隔以及 crontab 類型的任務(wù),并且可以持久化任務(wù),基于這些功能可以快速實(shí)現(xiàn) python 的定時(shí)輪詢?nèi)蝿?wù)系統(tǒng)。
使用 APScheduler 框架,可以通過(guò) pip 安裝
pip install apscheduler
APScheduler 框架包含四個(gè)組成部分
觸發(fā)器 (trigger)觸發(fā)器包含調(diào)度邏輯,每一個(gè)作業(yè)有它自己的觸發(fā)器,用于決定接下來(lái)哪一個(gè)作業(yè)會(huì)運(yùn)行;除了他們自己初始的配置,觸發(fā)器本身是無(wú)狀態(tài)的。
作業(yè)存儲(chǔ) (job store)作業(yè)存儲(chǔ)存儲(chǔ)被調(diào)度的作業(yè),默認(rèn)的作業(yè)存儲(chǔ)是簡(jiǎn)單的將作業(yè)保存到內(nèi)存中,如果選擇其他方式也可以將作業(yè)保存到數(shù)據(jù)庫(kù)中;一個(gè)作業(yè)數(shù)據(jù)的保存將會(huì)在持久化作業(yè)存儲(chǔ)的時(shí)候被序列化,然后在加載時(shí)被反序列化;調(diào)度器無(wú)法分享同一個(gè)作業(yè)存儲(chǔ)。
執(zhí)行器 (executor)執(zhí)行器處理作業(yè)的運(yùn)行,一般通過(guò)在作業(yè)中提交制定好的可調(diào)用對(duì)象到一個(gè)線程中或者線程池中來(lái)執(zhí)行;在作業(yè)完成時(shí),執(zhí)行器會(huì)去通知調(diào)度器。
調(diào)度器 (scheduler)調(diào)度器是 APScheduler 的核心,所有相關(guān)的組件都要通過(guò)它來(lái)定義,已配置好的任務(wù)也是要通過(guò)它來(lái)調(diào)度。
APScheduler 在 flask 中使用
因?yàn)?scheduler 任務(wù)需要耗費(fèi)較多時(shí)間,因此當(dāng)在項(xiàng)目中收到 flask 的接口請(qǐng)求后,可以通過(guò)線程異步處理耗時(shí)任務(wù),先將 “正在處理” 作為接口結(jié)果返回,
示例代碼結(jié)構(gòu)如下:
編寫(xiě)任務(wù)函數(shù),開(kāi)始 APScheduler 的調(diào)度
在通過(guò) flask 接口拿到需要的任務(wù)參數(shù)后,便可以創(chuàng)建調(diào)度任務(wù)。在創(chuàng)建調(diào)度任務(wù)之前,我們需要確定要選擇哪一種調(diào)度器、job 存儲(chǔ)、執(zhí)行器和觸發(fā)器,
調(diào)度器的選擇主要基于編程環(huán)境以及 APScheduler 的用途,
這里我們根據(jù)需要選擇 BackgroundScheduler。
在 job 存儲(chǔ)的選擇上,需要根據(jù)自己的 job 是否需要持久化,因?yàn)闆](méi)有特殊的需求,所以使用默認(rèn)的內(nèi)存方式
執(zhí)行器的選擇需要依據(jù) job 的類型,默認(rèn)的線程池執(zhí)行器apscheduler.executors.pool.ThreadPoolExecutor 已經(jīng)可以滿足大多數(shù)情況。
管理 job 的調(diào)度方式需要選擇一個(gè)合適的觸發(fā)器,APScheduler 內(nèi)置三種觸發(fā)器;
因?yàn)槲覀兊淖詣?dòng)化需要對(duì)各個(gè)子環(huán)節(jié)進(jìn)行驗(yàn)證,當(dāng)上一個(gè)環(huán)節(jié)成功后才能進(jìn)行下一個(gè)環(huán)節(jié)的驗(yàn)證,因此選擇 apscheduler.triggers.interval,以固定的時(shí)間間隔運(yùn)行 job。
部分項(xiàng)目代碼
periodic_task 是項(xiàng)目中的任務(wù)調(diào)度函數(shù);首先實(shí)例化了一個(gè) BackgroundScheduler 調(diào)度器,接著向調(diào)度器添加 job,添加的 job 為 data_task 函數(shù),同時(shí)定義了 job 的觸發(fā)器,指定固定的時(shí)間間隔為 58 秒。
其中 data_task 描述了具體的 job 細(xì)節(jié),即分別判斷當(dāng)前不同的任務(wù)節(jié)點(diǎn)執(zhí)行相應(yīng)的驗(yàn)證過(guò)程,并將每一步的驗(yàn)證狀態(tài)記錄到數(shù)據(jù)庫(kù)中,這樣在下一次執(zhí)行 data_task 時(shí),就可以去校驗(yàn)新的環(huán)節(jié);
啟動(dòng)調(diào)度器使用 start 函數(shù),結(jié)束調(diào)度器使用 shutdown 函數(shù);
shutdown 函數(shù)可以指定停止條件,在本項(xiàng)目中,因?yàn)椴襟E比較多,一旦有環(huán)節(jié)出錯(cuò),就需要結(jié)束任務(wù),保存已驗(yàn)證的環(huán)節(jié),因此在拿到任務(wù)結(jié)果時(shí),不論是整個(gè)驗(yàn)證成功的結(jié)果,還是某個(gè)環(huán)節(jié)出錯(cuò)的結(jié)果,都會(huì)停止本次調(diào)度,結(jié)束掉本次驗(yàn)證。
總結(jié)
- APScheduler 在 flask 中使用需要用到線程池異步去處理耗時(shí)任務(wù);
- 使用 APScheduler 需要配置好合適的調(diào)度器、job 存儲(chǔ)、執(zhí)行器和觸發(fā)器;
- 在業(yè)務(wù)中驗(yàn)證復(fù)雜連續(xù)的步驟可以使用輪詢的方式,并設(shè)置好任務(wù)結(jié)束的條件,不僅可以校驗(yàn)每一步的驗(yàn)證結(jié)果而且有環(huán)節(jié)出錯(cuò)也不影響整個(gè)流程。
以上就是python自動(dòng)化測(cè)試中APScheduler Flask的應(yīng)用示例的詳細(xì)內(nèi)容,更多關(guān)于python自動(dòng)化測(cè)試APScheduler Flask的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- python自動(dòng)化測(cè)試工具Helium使用示例
- Python?pytest自動(dòng)化測(cè)試庫(kù)十個(gè)強(qiáng)大用法示例
- python自動(dòng)化測(cè)試Data?Driven?Testing(DDT)用例解析
- Python UI自動(dòng)化測(cè)試Web frame及多窗口切換
- python自動(dòng)化測(cè)試用例全對(duì)偶組合與全覆蓋組合比較
- python自動(dòng)化測(cè)試通過(guò)日志3分鐘定位bug
- python自動(dòng)化測(cè)試selenium屏幕截圖示例
- python自動(dòng)化測(cè)試selenium定位frame及iframe示例
- python?Helium自動(dòng)化庫(kù)的功能特性探索
相關(guān)文章
Pygame出現(xiàn)播放背景音樂(lè)卡頓的問(wèn)題分析及解決(發(fā)生在win10更新至win11后)
Pygame是常用的游戲開(kāi)發(fā)庫(kù)之一,然而在使用Pygame的過(guò)程中,卻出現(xiàn)了播放背景音樂(lè)卡頓的問(wèn)題,表現(xiàn)為咯咯咯的噪音,所以本文記錄了Pygame出現(xiàn)播放背景音樂(lè)卡頓的問(wèn)題分析及解決,需要的朋友可以參考下2024-02-02使用Python實(shí)現(xiàn)數(shù)據(jù)重采樣的示例代碼
數(shù)據(jù)重采樣是一種用于調(diào)整數(shù)據(jù)集大小或分布的技術(shù),它涉及通過(guò)增加或減少數(shù)據(jù)點(diǎn)的數(shù)量來(lái)修改現(xiàn)有數(shù)據(jù)集,下面我們就來(lái)學(xué)習(xí)一下如何利用Python實(shí)現(xiàn)數(shù)據(jù)重采樣吧2023-11-11Python使用函數(shù)輔助工具簡(jiǎn)化開(kāi)發(fā)提高效率
這篇文章主要為大家介紹了Python使用函數(shù)輔助工具簡(jiǎn)化開(kāi)發(fā)提高效率,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01解決python中set與dict的無(wú)序問(wèn)題
這篇文章主要介紹了解決python中set與dict的無(wú)序問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-03-03pandas的to_datetime時(shí)間轉(zhuǎn)換使用及學(xué)習(xí)心得
這篇文章主要給大家介紹了關(guān)于pandas的to_datetime時(shí)間轉(zhuǎn)換使用及學(xué)習(xí)心得的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用pandas具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08在Django中編寫(xiě)模版節(jié)點(diǎn)及注冊(cè)標(biāo)簽的方法
這篇文章主要介紹了在Django中編寫(xiě)模版節(jié)點(diǎn)及注冊(cè)標(biāo)簽的方法,Django是Python各式各樣的高人氣框架中最為著名的一個(gè),需要的朋友可以參考下2015-07-07