您好,登錄后才能下訂單哦!
Python 利用schedule進行任務調度?針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
如果需要執行更復雜的任務調度,則可使用 Python 提供的 sched 模塊。該模塊提供了 sched.scheduler 類,該類代表一個任務調度器。
sched.scheduler(timefunc=time.monotonic, delayfunc=time.sleep) 構造器支持兩個參數:
timefunc:該參數指定生成時間戳的時間函數,默認使用 time.monotonic 來生成時間戳。
delayfunc:該參數指定阻塞程序的函數,默認使用 time.sleep 函數來阻塞程序。
sched.scheduler 調度器支持如下常用屬性和方法:
scheduler.enterabs(time, priority, action, argument=(), kwargs={}):指定在 time 時間點執行 action 函數,argument 和 kwargs 都用于向 action 函數傳入參數,其中 argument 使用位置參數的形式傳入參數,kwargs 使用關鍵字參數的形式傳入參數。該方法返回一個 event,它可作為 cancel() 方法的參數用于取消該調度。priority 參數指定該任務的優先級,當在同一個時間點有多個任務需要執行時,優先級高(值越小代表優先級越高)的任務會優先執行。
scheduler.enter(delay, priority, action, argument=(),kwargs={}):該方法與上一個方法基本相同,只是 delay 參數用于指定多少秒之后執行 action 任務。
scheduler.cancel(event):取消任務。如果傳入的 event 參數不是當前調度隊列中的 event,程序將會引發 ValueError 異常。
scheduler.empty():判斷當前該調度器的調度隊列是否為空。
scheduler.run(blocking=True):運行所有需要調度的任務。如果調用該方法的 blocking 參數為 True,該方法將會阻塞線程,直到所有被調度的任務都執行完成。
scheduler.queue:該只讀屬性返回該調度器的調度隊列。
下面程序示范了使用 sched.scheduler 來執行任務調度:
import sched, time import threading # 定義線程調度器 s = sched.scheduler() # 定義被調度的函數 def print_time(name='default'): print("%s 的時間: %s" % (name, time.ctime())) print('主線程:', time.ctime()) # 指定10秒之后執行print_time函數 s.enter(10, 1, print_time) # 指定5秒之后執行print_time函數,優先級為2 s.enter(5, 2, print_time, argument=('位置參數',)) # 指定5秒之后執行print_time函數,優先級為1 s.enter(5, 1, print_time, kwargs={'name': '關鍵字參數'}) # 執行調度的任務 s.run() print('主線程:', time.ctime())
上面程序中,第 12 行代碼指定 10s 后執行 print_time() 函數,本次調度沒有為該函數傳入參數;第 14 行代碼指定 5s 后調度 print_time() 函數,本次調度使用位置參數的形式為該函數傳入參數;第 16 行代碼指定 5s 后調度 print_time() 函數,本次調度使用關鍵字參數的形式為該函數傳入參數。
上面程序運行后,將會看到程序在 5s 后執行兩次 print_time() 函數,其中傳入關鍵字參數的函數先執行(它的優先級更高),10s 后執行一次 print_time() 函數。運行上面程序,將看到如下輸出結果:
主線程: Tue Mar 5 16:30:51 2019 關鍵字參數 的時間: Tue Mar 5 16:30:56 2019 位置參數 的時間: Tue Mar 5 16:30:56 2019 default 的時間: Tue Mar 5 16:31:01 2019 主線程: Tue Mar 5 16:31:01 2019
關于Python 利用schedule進行任務調度問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。