sched — 事件排程器

原始碼: Lib/sched.py


sched 模組定義了一個類,該類實現了一個通用事件排程器

class sched.scheduler(timefunc=time.monotonic, delayfunc=time.sleep)

scheduler 類定義了排程事件的通用介面。 它需要兩個函式來實際處理“外部世界”——timefunc 應該可以在沒有引數的情況下呼叫,並返回一個數字(“時間”,以任何單位表示)。 delayfunc 函式應該可以用一個與 timefunc 的輸出相容的引數呼叫,並且應該延遲那麼多時間單位。在每次事件執行後,delayfunc 也會使用引數 0 呼叫,以便在多執行緒應用程式中允許其他執行緒有機會執行。

在 3.3 版本中更改: timefuncdelayfunc 引數是可選的。

在 3.3 版本中更改: scheduler 類可以在多執行緒環境中安全使用。

示例

>>> 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',))
...     # despite having higher priority, 'keyword' runs after 'positional' as enter() is relative
...     s.enter(5, 1, print_time, kwargs={'a': 'keyword'})
...     s.enterabs(1_650_000_000, 10, print_time, argument=("first enterabs",))
...     s.enterabs(1_650_000_000, 5, print_time, argument=("second enterabs",))
...     s.run()
...     print(time.time())
...
>>> print_some_times()
1652342830.3640375
From print_time 1652342830.3642538 second enterabs
From print_time 1652342830.3643398 first enterabs
From print_time 1652342835.3694863 positional
From print_time 1652342835.3696074 keyword
From print_time 1652342840.369612 default
1652342840.3697174

排程器物件

scheduler 例項具有以下方法和屬性

scheduler.enterabs(time, priority, action, argument=(), kwargs={})

排程一個新事件。time 引數應該是一個與傳遞給建構函式的 timefunc 函式的返回值相容的數字型別。為同一 time 排程的事件將按照它們的 priority 順序執行。數字越小表示優先順序越高。

執行事件意味著執行 action(*argument, **kwargs)argument 是一個序列,儲存著 action 的位置引數。 kwargs 是一個字典,儲存著 action 的關鍵字引數。

返回值是一個事件,可用於稍後取消該事件(請參閱 cancel())。

在 3.3 版本中更改: argument 引數是可選的。

在 3.3 版本中更改: 添加了 kwargs 引數。

scheduler.enter(delay, priority, action, argument=(), kwargs={})

排程一個在 delay 個時間單位後發生的事件。除了相對時間之外,其他引數、效果和返回值與 enterabs() 的相同。

在 3.3 版本中更改: argument 引數是可選的。

在 3.3 版本中更改: 添加了 kwargs 引數。

scheduler.cancel(event)

從佇列中刪除事件。如果 event 不是當前在佇列中的事件,此方法將引發 ValueError

scheduler.empty()

如果事件佇列為空,則返回 True

scheduler.run(blocking=True)

執行所有已排程的事件。此方法將等待(使用傳遞給建構函式的 delayfunc 函式)下一個事件,然後執行它,以此類推,直到沒有更多已排程的事件。

如果 blocking 為 false,則執行即將到期的已排程事件(如果有),然後返回排程器中下一個已排程呼叫的截止時間(如果有)。

actiondelayfunc 都可以引發異常。 在任何一種情況下,排程程式都將保持一致的狀態並傳播異常。如果 action 引發異常,則在將來對 run() 的呼叫中,將不再嘗試該事件。

如果一系列事件的執行時間比下一個事件之前可用的時間長,則排程程式只會滯後。不會丟棄任何事件; 呼叫程式碼負責取消不再相關的事件。

在 3.3 版本中更改: 添加了 blocking 引數。

scheduler.queue

只讀屬性,返回即將執行的事件列表,按它們將執行的順序排列。每個事件都顯示為一個 命名元組,包含以下欄位:time、priority、action、argument、kwargs。