事件調(diào)度
sched 模塊內(nèi)容很簡單,只定義了一個(gè)類。它用來最為一個(gè)通用的事件調(diào)度模塊。
class sched.scheduler(timefunc, delayfunc) 這個(gè)類定義了調(diào)度事件的通用接口,它需要外部傳入兩個(gè)參數(shù), timefunc 是一個(gè)沒有參數(shù)的返回時(shí)間類型數(shù)字的函數(shù)(常用使用的如time模塊里面的time), delayfunc 應(yīng)該是一個(gè)需要一個(gè)參數(shù)來調(diào)用、與timefunc的輸出兼容、并且作用為延遲多個(gè)時(shí)間單位的函數(shù)(常用的如time模塊的sleep)。
下面是一個(gè)列子:
import sched, times = sched.scheduler(time.time, time.sleep) # 生成調(diào)度器def print_time():print "From print_time", time.time()def print_some_times():print time.time()s.enter(5, 1, print_time, ()) # 加入調(diào)度事件# 四個(gè)參數(shù)分別是:# 間隔事件(具體值決定與delayfunc, 這里為秒);# 優(yōu)先級(兩個(gè)事件在同一時(shí)間到達(dá)的情況);# 觸發(fā)的函數(shù);# 函數(shù)參數(shù);s.enter(10, 1, print_time, ())# 運(yùn)行s.run()print time.time()if __name__ == '__main__':print_some_times()
看到的輸出結(jié)果,隔5秒中執(zhí)行第一個(gè)事件,隔10秒后執(zhí)行第二個(gè)事件:
1499259731.99From print_time 1499259736.99From print_time 1499259741.991499259741.99
在多線程場景中,會(huì)有線程安全問題,run()函數(shù)會(huì)阻塞主線程。官方建議使用 threading.Timer 類代替:
import timefrom threading import Timerdef print_time():print "From print_time", time.time()def print_some_times():print time.time()Timer(5, print_time, ()).start()Timer(10, print_time, ()).start()time.sleep(11) # 阻塞主線程,等待調(diào)度程序執(zhí)行完畢,再執(zhí)行后面內(nèi)容print time.time()if __name__ == '__main__':print_some_times()
Scheduler對象方法
scheduler對象擁有下面這些方法或?qū)傩?
scheduler.enterabs(time, priority, action, argument)
加入一個(gè)事件, time 參數(shù)應(yīng)該是一個(gè)與傳遞給構(gòu)造函數(shù)的 timefunc 函數(shù)的返回值相兼容的數(shù)值類型。在同一時(shí)間到達(dá)的事件將按照 priority 順序執(zhí)行。
執(zhí)行事件其實(shí)就是執(zhí)行 action(argument) 。argument必須是一個(gè)包含 action 參數(shù)的序列。
返回值是一個(gè)事件,它可以用于稍后取消事件(請參見 cancel() )。
scheduler.enter(delay, priority, action, argument)
安排一個(gè)事件來延遲 delay 個(gè)時(shí)間單位。除了時(shí)間外,其他參數(shù)、含義和返回值與 enterabs() 的值相同。其實(shí)內(nèi)部 enterabs 就是用來被 enter 調(diào)用。
scheduler.cancel(event)
從隊(duì)列中刪除事件。如果事件不是當(dāng)前隊(duì)列中的事件,則該方法將跑出一個(gè) ValueError 。
scheduler.empty()
判斷隊(duì)列是否為空。
scheduler.run()
運(yùn)行所有預(yù)定的事件。這個(gè)函數(shù)將等待(使用傳遞給構(gòu)造函數(shù)的 delayfunc() 函數(shù)),然后執(zhí)行事件,直到不再有預(yù)定的事件。
新聞熱點(diǎn)
疑難解答
圖片精選