sched——通用時間調度器
sched模塊實現了一個通用事件調度器,在調度器類使用一個延遲函數等待特定的時間,執行任務。同時支持多線程應用程序,在每個任務執行后會立刻調用延時函數,以確保其他線程也能執行。
一、延遲運行事件
在一個延遲或規定時間之后執行事件,需要采用enter()方法,包含4個參數:
-
間隔時間(具體值決定與delayfunc, 這里為秒)
-
優先級(兩個事件在同一時間到達的情況)
-
調用的函數
-
函數參數
例子:
import sched import time #生成調度器 scheduler = sched.scheduler(time.time, time.sleep) def print_event(name): print ('EVENT:', time.time(), name) print ('START:', time.time()) #分別設置在執行后2秒、3秒之后執行調用函數 scheduler.enter(2, 1, print_event, ('first',)) scheduler.enter(3, 1, print_event, ('second',)) #運行調度器 scheduler.run()
輸出結果:
START: 1532050215.3737717 EVENT: 1532050217.3747234 first EVENT: 1532050218.375626 second
二、重疊事件
調用run()塊執行所有的事件。每個事件都在同一線程中運行,所以如果一個事件需要更長的時間,延遲事件將會有重疊。為了不丟失事件,延遲事件將會在之前事件運行完再被執行,但一些延遲事件可能會晚於原本計划的事件。
例子:
import sched import time scheduler = sched.scheduler(time.time, time.sleep) def long_event(name): print('BEGIN EVENT :', time.time(), name) time.sleep(2) print('FINISH EVENT:', time.time(), name) print('START:', time.time()) scheduler.enter(2, 1, long_event, ('first',)) #事件無法在設想的3秒后執行,將會順延執行 scheduler.enter(3, 1, long_event, ('second',)) scheduler.run()
輸出結果:
START: 1532051082.8237524 BEGIN EVENT : 1532051084.8392828 first FINISH EVENT: 1532051086.8475456 first BEGIN EVENT : 1532051086.8475456 second FINISH EVENT: 1532051088.8557353 second
三、事件優先級
如果多個事件是同一時間執行,通過設置他們的優先級值,用於確定順序運行
例子:
import sched import time scheduler = sched.scheduler(time.time, time.sleep) def print_event(name): print('EVENT:', time.time(), name) now = time.time() print('START:', now) scheduler.enterabs(now+2, 2, print_event, ('first',)) scheduler.enterabs(now+2, 1, print_event, ('second',)) scheduler.run()
輸出結果:
START: 1532052567.6057265 EVENT: 1532052569.621258 second EVENT: 1532052569.621258 first
四、取消事件
利用enter()和enterabs()返回一個引用事件用來取消它。
例子:
import sched import threading import time scheduler = sched.scheduler(time.time, time.sleep) #建立一個全局 線程計數器 counter = 0 def increment_counter(name): global counter print('EVENT:', time.time(), name) counter += 1 print('NOW:', counter) print('START:', time.time()) e1 = scheduler.enter(2, 1, increment_counter, ('E1',)) e2 = scheduler.enter(3, 1, increment_counter, ('E2',)) # 開始一個線程執行事件 t = threading.Thread(target=scheduler.run) t.start() # 在主線程,取消第一個預定事件 scheduler.cancel(e1) # 等待線程調度程序完成運行 t.join()
輸出結果:
START: 1532053265.5280123 EVENT: 1532053268.528813 E2 NOW: 1
除了上面介紹的scheduler方法,還有一些其他方法:
scheduler.empty()
判斷隊列是否為空
scheduler.queue
只讀屬性,返回一個即將到達的事件列表(按到達事件排序),每個事件都是有 time 、 priority 、 action 、 argument 組成的 namedtuple 。
參考來源:https://pymotw.com/2/sched/index.html