sched
--- 事件調度器?
源碼: Lib/sched.py
sched
模塊定義了一個(gè)實(shí)現通用事件調度程序的類(lèi):
- class sched.scheduler(timefunc=time.monotonic, delayfunc=time.sleep)?
scheduler
類(lèi)定義了一個(gè)調度事件的通用接口。 它需要兩個(gè)函數來(lái)實(shí)際處理“外部世界” —— timefunc 應當不帶參數地調用,并返回一個(gè)數字(“時(shí)間”,可以為任意單位)。 delayfunc 函數應當帶一個(gè)參數調用,與 timefunc 的輸出相兼容,并且應當延遲其所指定的時(shí)間單位。 每個(gè)事件運行后還將調用 delayfunc 并傳入參數0
以允許其他線(xiàn)程有機會(huì )在多線(xiàn)程應用中運行。在 3.3 版更改: timefunc 和 delayfunc 參數是可選的。
在 3.3 版更改:
scheduler
類(lèi)可以安全的在多線(xiàn)程環(huán)境中使用。
示例:
>>> import sched, time
>>> s = sched.scheduler(time.time, time.sleep)
>>> def print_time(a='default'):
... print("From print_time", time.time(), a)
...
>>> def print_some_times():
... print(time.time())
... s.enter(10, 1, print_time)
... s.enter(5, 2, print_time, argument=('positional',))
... s.enter(5, 1, print_time, kwargs={'a': 'keyword'})
... s.run()
... print(time.time())
...
>>> print_some_times()
930343690.257
From print_time 930343695.274 positional
From print_time 930343695.275 keyword
From print_time 930343700.273 default
930343700.276
調度器對象?
scheduler
實(shí)例擁有以下方法和屬性:
- scheduler.enterabs(time, priority, action, argument=(), kwargs={})?
安排一個(gè)新事件。 time 參數應該有一個(gè)數字類(lèi)型兼容的返回值,與傳遞給構造函數的 timefunc 函數的返回值兼容。 計劃在相同 time 的事件將按其 priority 的順序執行。 數字越小表示優(yōu)先級越高。
執行事件意為執行
action(*argument, **kwargs)
。 argument 是包含有 action 的位置參數的序列。 kwargs 是包含 action 的關(guān)鍵字參數的字典。返回值是一個(gè)事件,可用于以后取消事件( 參見(jiàn)
cancel()
)。在 3.3 版更改: argument 參數是可選的。
在 3.3 版更改: 添加了 kwargs 形參。
- scheduler.enter(delay, priority, action, argument=(), kwargs={})?
安排延后 delay 時(shí)間單位的事件。 除了相對時(shí)間,其他參數、效果和返回值與
enterabs()
的相同。在 3.3 版更改: argument 參數是可選的。
在 3.3 版更改: 添加了 kwargs 形參。
- scheduler.cancel(event)?
從隊列中刪除事件。 如果 event 不是當前隊列中的事件,則此方法將引發(fā)
ValueError
。
- scheduler.empty()?
如果事件隊列為空則返回
True
。
- scheduler.run(blocking=True)?
運行所有預定事件。 此方法將等待(使用傳遞給構造函數的
delayfunc()
函數)進(jìn)行下一個(gè)事件,然后執行它,依此類(lèi)推,直到?jīng)]有更多的計劃事件。如果 blocking 為false,則執行由于最快到期(如果有)的預定事件,然后在調度程序中返回下一個(gè)預定調用的截止時(shí)間(如果有)。
action 或 delayfunc 都可以引發(fā)異常。 在任何一種情況下,調度程序都將保持一致?tīng)顟B(tài)并傳播異常。 如果 action 引發(fā)異常,則在將來(lái)調用
run()
時(shí)不會(huì )嘗試該事件。如果一系列事件的運行時(shí)間大于下一個(gè)事件發(fā)生前的可用時(shí)間,那么調度程序將完全落后。 沒(méi)有事件會(huì )被丟棄;調用代碼負責取消不再相關(guān)的事件。
在 3.3 版更改: 添加了 blocking 形參。
- scheduler.queue?
只讀屬性按照將要運行的順序返回即將發(fā)生的事件列表。 每個(gè)事件都顯示為 named tuple ,包含以下字段:time、priority、action、argument、kwargs。