XML DOM 獲取節點值
624
2025-04-01
Python 自帶一個調度器模塊sched,它能為你實現優先級隊列/延遲隊列和定時隊列。
這個模塊的使用非常簡單,首先以延遲隊列為例:
import sched def do_work(name): print(f'你好:{name}') sch = sched.scheduler() sch.enter(5, 1, do_work, argument=('kingname', )) sch.run()
代碼運行以后,會卡在sch.run()這里,5秒鐘以后執行do_work('kingname'),運行效果如下圖所示:
其中,sch.enter()的第一個參數為延遲的時間,單位為秒,第二個參數為優先級,數字越小優先級越高。當兩個任務同時要執行時,優先級高的先執行。但需要注意的是,如果你這樣寫:
import sched def do_work(name): print(f'你好:{name}') sch = sched.scheduler() sch.enter(5, 2, do_work, argument=('產品經理', )) sch.enter(5, 1, do_work, argument=('kingname', )) sch.run()
那么先打印出來的是你好:產品經理,如下圖所示:
為什么這里優先級失效了?1的優先級大于2,應該先運行下面的才對啊。
這是由于,只有當兩個任務同時運行的時候,才會去檢查優先級。如果兩個任務觸發的時間一前一后,那么還輪不到比較優先級。由于延遲隊列的延遲是相對于當前運行這一行代碼的時間來計算的,后一行代碼比前一行代碼晚了幾毫秒,所以實際上產品經理這一行會先到時間,所以就會先運行。
為了使用絕對的精確時間,我們可以使用另外一個方法:
import sched import time import datetime def do_work(name): print(f'你好:{name}') sch = sched.scheduler(time.time, time.sleep) start_time = datetime.datetime.now() + datetime.timedelta(seconds=10) start_time_ts = start_time.timestamp() sch.enterabs(start_time_ts, 2, do_work, argument=('產品經理', )) sch.enterabs(start_time_ts, 1, do_work, argument=('kingname', )) sch.run()
運行效果如下圖所示:
sch.enterabs()的第一個參數是任務開始時間的時間戳,這是一個絕對時間,這個時間可以使用datetime模塊來生成,或者其他你熟悉的方式。后面的參數和sch.enter()完全一樣。
如果你要運行的函數帶有多個參數或者默認參數,那么可以使用下面的方式傳入參數:
import sched import time import datetime def do_work(name, place, work='寫代碼'): print(f'你好:{name},你在:{place}{work}') sch = sched.scheduler(time.time, time.sleep) start_time = datetime.datetime.now() + datetime.timedelta(seconds=10) start_time_ts = start_time.timestamp() sch.enter(5, 2, do_work, argument=('產品經理', '杭州'), kwargs={'work': '寫需求文檔'}) sch.enterabs(start_time_ts, 1, do_work, argument=('kingname', '產品經理旁邊'), kwargs={'work': '看著她'}) sch.run()
argument參數對應的元組存放普通參數,kwargs對應的字典存放帶參數名的參數。
Python
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。