Python定時任務實現方案

2022-09-24 14:36:20 字數 2833 閱讀 5074

目錄

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

定時任務,顧名思義:定時執行的任務,可以是一段bash命令,也可以是乙個指令碼檔案。通常用於我們需要在特定時刻做事情。

舉個例子: 每晚8點執行全業務場景介面自動化回歸測試,又或者每隔20分鐘去你家qq農場偷菜!

如果是大中型公司,一定有對應的平台讓大家接入。一般這樣的平台的名字或者描述都是: 分布式任務排程平台這樣的。再不濟還有jenkins滿足我們的需求~

想起博主以前"小時候"(剛工作的時候),公司既沒有用jenkins,也沒有這樣的大平台可以接入。我是怎麼做定時任務的呢?

來看一段**:

import time

from datetime import datetime

def func():

# 這個是定時任務要執行的ui/介面自動化方法

pass

def 程式設計客棧main():

while true:

# 獲取當前時間

now = datetime.now()

if now.hour == 20 and now.minute == 0:

# 當時間到達晚上8點0分,我們就開始跑自動化任務啦

print("任務開始執行")

func()

time.sleep(60)

if __name__ == "__main__":

main()

不知道現在是否還有人依然用著這樣的方式定時執行自動化測試,既然都2023年了,那咱們還是先進點吧程式設計客棧。那麼定時任務在python中要怎麼做呢?接著看。

2.1.1 schedule

如果你只是上面提到的簡單訴求,那我建議直接使用schedule庫。這個庫我個人感覺是小學生版本的公升級版,對於我那種侷限的sleep任務做了一些擴充套件:

安裝scheduler

pip install schedule

官網給出的例子

import schedule

import time

# 定義乙個執行方法

def job():

print("i'm working...")

# 每10分鐘執行一次job

schedule.every(10).minutes.do(job)

# 每小時執行一次job

schedule.every().hour.do(job)

# 每天10:30執行job

schedule.every().day.at("10:30").do(job)

# 每個星期一執行一次

schedule.every().monday.do(job)

# 每個星期三的13:15執行一次

schedule.every().wednesday.at("13:15").do(job)

# 在每分鐘的17秒執行一次

schedule.every().minute.at(":17").do(job)

while true:

# 進入sched迴圈

schedule.run_pending()

time.sleep(1)

可以看出,api十分簡單,語義也很清晰。基本可以滿足我們的需求了~如果我們只是要定時去做某些事情的話,我想這個庫非常human。

2.1.2 jenkins

這個工具相比大家都有所了解吧~jenkins是乙個比較強大的軟體了,它可以打通git/svn,也支援定時任務等。有著豐富的外掛程式,比如郵件,是一套完整的ci/cd解決方案。對於任務的執行結果的記錄,也是可追溯的。估計唯一的缺點就是,引入了額外的系統。可能本身我只是乙個自動化測試框架,現在卻要搭建一套jenkins。

如果大家有**改動->執行定時任務類似的需求,又需要完善的許可權控制系統的話,那jenkins會是你的不二選擇。

2.1.3 celery

我對這傢伙了解的不太多,但python+celery彷彿成了乙個固定搭配。不知道我理解的對不對:

celery是乙個任務佇列,你可以制定好任務執行的規則,放入佇列中,會有專門的消費端來幫你執行這些任務。

說到這裡就不得不提到持久化了~

什麼是持久化呢?通俗的講,就是瞬時資料(比如記憶體中的資料,是不能永久儲存的)持久化為持久資料(比如持久化至資料庫中,能夠長久儲存)

我們可以把資料放到檔案裡,也可以放到資料庫(實際上也是磁碟裡)進行永續性儲存。

這樣做的目的:資料可以儲存,下次也還能拿到這些資料。這裡面的內容太多了,打算後面再開一節來講。

我們在python裡面的變數啊,這些資料都是存放在記憶體當中的,所以我們剛才的schedule是不支援持久化的。(也可能是我沒研究到)

那jenkins支援嗎?他是支援的,你想,你建立乙個專案,裡面有一些job的配置,什麼時候執行,執行了幹嘛,最後儲存。

上述就是乙個持久化的過程。

你儲存了資料以後,下次能夠獲取到這個專案的任務資訊,也就是說你哪怕重啟了jenkins,任務依然存在。

說明任務本身作為了一條資料,持久地儲存了起來。

2.2.1 apscheduler

"apscheduler是乙個python庫,可讓您安排稍後要執行的python**,只需一次或定期執行。您可以根據您新增新的作業或刪除舊的舊作業。如果您在資料庫中儲存工作,他們還將存活排程程式重新啟動並保持狀態。重新啟動排程程式時,它將執行它在離線1時應該執行的所有作業。"

這是摘自apscheduler官網的介紹,總體來說它支援對任務的增刪改查(持久化),也能很好地支撐定時任務的執行。它相對來說比較輕量,不像celery那麼複雜,也不像schedule那麼簡陋。由於我們不打算引入jenkins,所以總體來說,apscheduler算得上是咱們執行定時任務的不二之選了。

Python定時任務實現

定時執行任務,定時 pip install schedule import schedule import time 不帶引數定時執行 def job print i m working.schedule.every 10 seconds.do job 每10秒執行一次 schedule.every...

spring boot 定時任務實現

scheduled 使用 scheduled 非常容易,直接建立乙個 spring boot 專案,並且新增 web 依賴 spring boot starter web,專案建立成功後,新增 enablescheduling 註解,開啟定時任務 enablescheduling 開啟定時任務 pu...

Spring定時任務實現

一 spring 定時任務 component enablescheduling 可以在啟動類上註解也可以在當前檔案 public class testschedule scheduled fixedrate 1000 10 public void runsecend scheduled fixed...