Python標(biāo)準(zhǔn)庫(kù)sched模塊使用指南
事件調(diào)度
sched 模塊內(nèi)容很簡(jiǎn)單,只定義了一個(gè)類(lèi)。它用來(lái)最為一個(gè)通用的事件調(diào)度模塊。
class sched.scheduler(timefunc, delayfunc) 這個(gè)類(lèi)定義了調(diào)度事件的通用接口,它需要外部傳入兩個(gè)參數(shù), timefunc 是一個(gè)沒(méi)有參數(shù)的返回時(shí)間類(lèi)型數(shù)字的函數(shù)(常用使用的如time模塊里面的time), delayfunc 應(yīng)該是一個(gè)需要一個(gè)參數(shù)來(lái)調(diào)用、與timefunc的輸出兼容、并且作用為延遲多個(gè)時(shí)間單位的函數(shù)(常用的如time模塊的sleep)。
下面是一個(gè)列子:
import sched, time s = 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)先級(jí)(兩個(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.99 From print_time 1499259736.99 From print_time 1499259741.99 1499259741.99
在多線(xiàn)程場(chǎng)景中,會(huì)有線(xiàn)程安全問(wèn)題,run()函數(shù)會(huì)阻塞主線(xiàn)程。官方建議使用 threading.Timer 類(lèi)代替:
import time from threading import Timer def 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) # 阻塞主線(xiàn)程,等待調(diào)度程序執(zhí)行完畢,再執(zhí)行后面內(nèi)容 print time.time() if __name__ == '__main__': print_some_times()
Scheduler對(duì)象方法
scheduler對(duì)象擁有下面這些方法或?qū)傩?
scheduler.enterabs(time, priority, action, argument)
加入一個(gè)事件, time 參數(shù)應(yīng)該是一個(gè)與傳遞給構(gòu)造函數(shù)的 timefunc 函數(shù)的返回值相兼容的數(shù)值類(lèi)型。在同一時(shí)間到達(dá)的事件將按照 priority 順序執(zhí)行。
執(zhí)行事件其實(shí)就是執(zhí)行 action(argument) 。argument必須是一個(gè)包含 action 參數(shù)的序列。
返回值是一個(gè)事件,它可以用于稍后取消事件(請(qǐng)參見(jiàn) cancel() )。
scheduler.enter(delay, priority, action, argument)
安排一個(gè)事件來(lái)延遲 delay 個(gè)時(shí)間單位。除了時(shí)間外,其他參數(shù)、含義和返回值與 enterabs() 的值相同。其實(shí)內(nèi)部 enterabs 就是用來(lái)被 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ù)定的事件。
任何 action 或 delayfunc 都可以引發(fā)異常。在這兩種情況下,調(diào)度器將保持一個(gè)一致的狀態(tài)并傳播異常。如果一個(gè)異常是由 action 引起的,就不會(huì)再繼續(xù)執(zhí)行 run() 。
scheduler.queue
只讀屬性,返回一個(gè)即將到達(dá)的事件列表(按到達(dá)事件排序),每個(gè)事件都是有 time 、 priority 、 action 、 argument 組成的 namedtuple 。
相關(guān)文章
Python中線(xiàn)程編程之threading模塊的使用詳解
這篇文章主要介紹了Python中線(xiàn)程編程之threading模塊的使用詳解,由于GIL的存在,線(xiàn)程一直是Python編程中的焦點(diǎn)問(wèn)題,需要的朋友可以參考下2015-06-06Pytorch卷積神經(jīng)網(wǎng)絡(luò)resent網(wǎng)絡(luò)實(shí)踐
這篇文章主要為大家介紹了Pytorch卷積神經(jīng)網(wǎng)絡(luò)resent網(wǎng)絡(luò)實(shí)踐,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05Python訪(fǎng)問(wèn)MongoDB,并且轉(zhuǎn)換成Dataframe的方法
今天小編就為大家分享一篇Python訪(fǎng)問(wèn)MongoDB,并且轉(zhuǎn)換成Dataframe的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-10-10python GUI庫(kù)圖形界面開(kāi)發(fā)之PyQt5線(xiàn)程類(lèi)QThread詳細(xì)使用方法
這篇文章主要介紹了python GUI庫(kù)圖形界面開(kāi)發(fā)之PyQt5線(xiàn)程QThread類(lèi)詳細(xì)使用方法,需要的朋友可以參考下2020-02-02Python中if __name__ == "__main__"詳細(xì)解釋
這篇文章主要介紹了Python中if __name__ == "__main__"詳細(xì)解釋,需要的朋友可以參考下2014-10-10python里使用正則表達(dá)式的組嵌套實(shí)例詳解
這篇文章主要介紹了python里使用正則表達(dá)式的組嵌套實(shí)例詳解的相關(guān)資料,希望通過(guò)本文能幫助到大家,需要的朋友可以參考下2017-10-10python訪(fǎng)問(wèn)抓取網(wǎng)頁(yè)常用命令總結(jié)
這篇文章主要介紹了python訪(fǎng)問(wèn)抓取網(wǎng)頁(yè)常用命令的相關(guān)資料,需要的朋友可以參考下2017-04-04簡(jiǎn)單了解Django應(yīng)用app及分布式路由
這篇文章主要介紹了簡(jiǎn)單了解Django應(yīng)用app及分布式路由,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-07-07