Python定時(shí)任務(wù)實(shí)現(xiàn)方案
我正在從0到1打造一個(gè)開(kāi)源的接口測(cè)試平臺(tái), 也在編寫(xiě)一套與之對(duì)應(yīng)的完整教程,希望大家多多支持。
1、定時(shí)任務(wù)
定時(shí)任務(wù),顧名思義: 定時(shí)執(zhí)行的任務(wù),可以是一段bash命令,也可以是一個(gè)腳本文件。通常用于我們需要在特定時(shí)刻做事情。
舉個(gè)例子: 每晚8點(diǎn)執(zhí)行全業(yè)務(wù)場(chǎng)景接口自動(dòng)化回歸測(cè)試,又或者每隔20分鐘去你家QQ農(nóng)場(chǎng)偷菜!
2、Python的定時(shí)任務(wù)
如果是大中型公司,一定有對(duì)應(yīng)的平臺(tái)讓大家接入。一般這樣的平臺(tái)的名字或者描述都是: 分布式任務(wù)調(diào)度平臺(tái)這樣的。再不濟(jì)還有jenkins滿(mǎn)足我們的需求~
想起博主以前"小時(shí)候"(剛工作的時(shí)候),公司既沒(méi)有用jenkins,也沒(méi)有這樣的大平臺(tái)可以接入。我是怎么做定時(shí)任務(wù)的呢?
來(lái)看一段代碼:
import time
from datetime import datetime
def func():
# 這個(gè)是定時(shí)任務(wù)要執(zhí)行的ui/接口自動(dòng)化方法
pass
def main():
while True:
# 獲取當(dāng)前時(shí)間
now = datetime.now()
if now.hour == 20 and now.minute == 0:
# 當(dāng)時(shí)間到達(dá)晚上8點(diǎn)0分,我們就開(kāi)始跑自動(dòng)化任務(wù)啦
print("任務(wù)開(kāi)始執(zhí)行")
func()
time.sleep(60)
if __name__ == "__main__":
main()
不知道現(xiàn)在是否還有人依然用著這樣的方式定時(shí)執(zhí)行自動(dòng)化測(cè)試,既然都2021年了,那咱們還是先進(jìn)點(diǎn)吧。那么定時(shí)任務(wù)在Python中要怎么做呢?接著看。
2.1 幾種常見(jiàn)的方案
2.1.1 schedule
如果你只是上面提到的簡(jiǎn)單訴求,那我建議直接使用schedule庫(kù)。這個(gè)庫(kù)我個(gè)人感覺(jué)是小學(xué)生版本的升級(jí)版,對(duì)于我那種局限的sleep任務(wù)做了一些擴(kuò)展:
- 支持了按周期執(zhí)行任務(wù)
- 執(zhí)行時(shí)間閱讀起來(lái)更人性化
- 還支持星期X執(zhí)行
安裝scheduler
pip install schedule
官網(wǎng)給出的例子
import schedule
import time
# 定義一個(gè)執(zhí)行方法
def job():
print("I'm working...")
# 每10分鐘執(zhí)行一次job
schedule.every(10).minutes.do(job)
# 每小時(shí)執(zhí)行一次job
schedule.every().hour.do(job)
# 每天10:30執(zhí)行job
schedule.every().day.at("10:30").do(job)
# 每個(gè)星期一執(zhí)行一次
schedule.every().monday.do(job)
# 每個(gè)星期三的13:15執(zhí)行一次
schedule.every().wednesday.at("13:15").do(job)
# 在每分鐘的17秒執(zhí)行一次
schedule.every().minute.at(":17").do(job)
while True:
# 進(jìn)入schedule循環(huán)
schedule.run_pending()
time.sleep(1)
可以看出,api十分簡(jiǎn)單,語(yǔ)義也很清晰?;究梢詽M(mǎn)足我們的需求了~如果我們只是要定時(shí)去做某些事情的話(huà),我想這個(gè)庫(kù)非常human。
2.1.2 Jenkins
這個(gè)工具相比大家都有所了解吧~jenkins是一個(gè)比較強(qiáng)大的軟件了,它可以打通git/svn,也支持定時(shí)任務(wù)等。有著豐富的插件,比如郵件,是一套完整的CI/CD解決方案。對(duì)于任務(wù)的執(zhí)行結(jié)果的記錄,也是可追溯的。估計(jì)唯一的缺點(diǎn)就是,引入了額外的系統(tǒng)??赡鼙旧砦抑皇且粋€(gè)自動(dòng)化測(cè)試框架,現(xiàn)在卻要搭建一套jenkins。
如果大家有代碼改動(dòng)->執(zhí)行定時(shí)任務(wù)類(lèi)似的需求,又需要完善的權(quán)限控制系統(tǒng)的話(huà),那jenkins會(huì)是你的不二選擇。
2.1.3 Celery

我對(duì)這家伙了解的不太多,但python+celery仿佛成了一個(gè)固定搭配。不知道我理解的對(duì)不對(duì):
celery是一個(gè)任務(wù)隊(duì)列,你可以制定好任務(wù)執(zhí)行的規(guī)則,放入隊(duì)列中,會(huì)有專(zhuān)門(mén)的消費(fèi)端來(lái)幫你執(zhí)行這些任務(wù)。
說(shuō)到這里就不得不提到持久化了~
2.2 題外話(huà)之持久化
什么是持久化呢?通俗的講,就是瞬時(shí)數(shù)據(jù)(比如內(nèi)存中的數(shù)據(jù),是不能永久保存的)持久化為持久數(shù)據(jù)(比如持久化至數(shù)據(jù)庫(kù)中,能夠長(zhǎng)久保存)
我們可以把數(shù)據(jù)放到文件里,也可以放到數(shù)據(jù)庫(kù)(實(shí)際上也是磁盤(pán)里)進(jìn)行持久性保存。
這樣做的目的: 數(shù)據(jù)可以存儲(chǔ),下次也還能拿到這些數(shù)據(jù)。這里面的內(nèi)容太多了,打算后面再開(kāi)一節(jié)來(lái)講。
我們?cè)?code>Python里面的變量啊,這些數(shù)據(jù)都是存放在內(nèi)存當(dāng)中的,所以我們剛才的schedule是不支持持久化的。(也可能是我沒(méi)研究到)
那jenkins支持嗎?他是支持的,你想,你建立一個(gè)項(xiàng)目,里面有一些job的配置,什么時(shí)候執(zhí)行,執(zhí)行了干嘛,最后保存。
上述就是一個(gè)持久化的過(guò)程。
你保存了數(shù)據(jù)以后,下次能夠獲取到這個(gè)項(xiàng)目的任務(wù)信息,也就是說(shuō)你哪怕重啟了jenkins,任務(wù)依然存在。
說(shuō)明任務(wù)本身作為了一條數(shù)據(jù),持久地保存了起來(lái)。
2.2.1 ApScheduler
"APScheduler是一個(gè)Python庫(kù),可讓您安排稍后要執(zhí)行的Python代碼,只需一次或定期執(zhí)行。您可以根據(jù)您添加新的作業(yè)或刪除舊的舊作業(yè)。如果您在數(shù)據(jù)庫(kù)中存儲(chǔ)工作,他們還將存活調(diào)度程序重新啟動(dòng)并保持狀態(tài)。重新啟動(dòng)調(diào)度程序時(shí),它將運(yùn)行它在脫機(jī)1時(shí)應(yīng)該運(yùn)行的所有作業(yè)。"
這是摘自ApScheduler官網(wǎng)的介紹,總體來(lái)說(shuō)它支持對(duì)任務(wù)的增刪改查(持久化),也能很好地支撐定時(shí)任務(wù)的執(zhí)行。它相對(duì)來(lái)說(shuō)比較輕量,不像celery那么復(fù)雜,也不像schedule那么簡(jiǎn)陋。由于我們不打算引入jenkins,所以總體來(lái)說(shuō),ApScheduler算得上是咱們執(zhí)行定時(shí)任務(wù)的不二之選了。
到此這篇關(guān)于Python定時(shí)任務(wù)實(shí)現(xiàn)方案的文章就介紹到這了,更多相關(guān)Python定時(shí)任務(wù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 實(shí)現(xiàn)Windows下設(shè)置定時(shí)任務(wù)來(lái)運(yùn)行python腳本
- 如何給windows設(shè)置定時(shí)任務(wù)并運(yùn)行python腳本
- 剛學(xué)完怎么用Python實(shí)現(xiàn)定時(shí)任務(wù),轉(zhuǎn)頭就跑去撩妹!
- python 實(shí)現(xiàn)定時(shí)任務(wù)的四種方式
- 5分鐘快速掌握Python定時(shí)任務(wù)框架的實(shí)現(xiàn)
- python 基于A(yíng)pscheduler實(shí)現(xiàn)定時(shí)任務(wù)
- Python定時(shí)任務(wù)框架APScheduler原理及常用代碼
- Python定時(shí)任務(wù)APScheduler安裝及使用解析
相關(guān)文章
基于python+pandoc實(shí)現(xiàn)html批量轉(zhuǎn)word
pandoc是一個(gè)強(qiáng)大的文檔格式轉(zhuǎn)換工具,支持豐富的格式轉(zhuǎn)換,并盡可能的保留原來(lái)的排版,號(hào)稱(chēng)文檔格式轉(zhuǎn)換的瑞士軍刀,本文將給大家介紹一下使用python搭配pandoc實(shí)現(xiàn)html批量轉(zhuǎn)word,感興趣的朋友可以參考閱讀下2023-09-09
分析解決Python中sqlalchemy數(shù)據(jù)庫(kù)連接池QueuePool異常
這篇文章主要來(lái)給大家分析sqlalchemy數(shù)據(jù)庫(kù)連接池QueuePool的異常,給大家用詳細(xì)的圖文方式做出了解決的方案,有需要的朋友可以借鑒參考下,希望可以有所幫助2021-09-09
查看TensorFlow checkpoint文件中的變量名和對(duì)應(yīng)值方法
今天小編就為大家分享一篇查看TensorFlow checkpoint文件中的變量名和對(duì)應(yīng)值方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-06-06
利用Python中unittest實(shí)現(xiàn)簡(jiǎn)單的單元測(cè)試實(shí)例詳解
如果項(xiàng)目復(fù)雜,進(jìn)行單元測(cè)試是保證降低出錯(cuò)率的好方法,Python提供的unittest可以很方便的實(shí)現(xiàn)單元測(cè)試,從而可以替換掉繁瑣雜亂的main函數(shù)測(cè)試的方法,將測(cè)試用例、測(cè)試方法進(jìn)行統(tǒng)一的管理和維護(hù)。本文主要介紹了利用Python中unittest實(shí)現(xiàn)簡(jiǎn)單的單元測(cè)試。2017-01-01
python進(jìn)階教程之函數(shù)對(duì)象(函數(shù)也是對(duì)象)
這篇文章主要介紹了python進(jìn)階教程之函數(shù)對(duì)象,函數(shù)對(duì)象是指函數(shù)也是對(duì)象,本文還講解了lambda函數(shù)、函數(shù)作為參數(shù)傳遞、map()函數(shù)、filter()函數(shù)、reduce()函數(shù)等內(nèi)容,需要的朋友可以參考下2014-08-08
python pandas 時(shí)間日期的處理實(shí)現(xiàn)
這篇文章主要介紹了python pandas 時(shí)間日期的處理實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07

