沒事逛了逛python
標準庫,看的了一個頗有意思的模塊(sched
),十分簡短,讀起來也比較容易,整個模塊加上註釋一共才100
多行代碼,功能卻至關強大,總結出來跟你們分享一下。python
python
標準庫提供了一個sched
模塊,它定義了一個實現通用事件調度程序的類。在介紹其用法以前,咱們先看一眼它的源碼是什麼樣子。多線程
class scheduler: def __init__(self, timefunc=_time, delayfunc=time.sleep): self._queue = [] self._lock = threading.RLock() self.timefunc = timefunc self.delayfunc = delayfunc def enterabs(self, time, priority, action, argument=(), kwargs=_sentinel): pass def enter(self, delay, priority, action, argument=(), kwargs=_sentinel): pass def cancel(self, event): pass def empty(self): pass def run(self, blocking=True): pass @property def queue(self): pass
上面是它全部的方法和屬性了,沒錯,就這麼簡潔,爲了方便預覽,這裏把實現給省略了。下面咱們逐一介紹各個方法和屬性。函數
在詳細介紹這些API以前,我先看一看scheduler
類,內部用到的事件(Event
)對象是什麼,看看定義.net
class Event(namedtuple('Event', 'time, priority, action, argument, kwargs')): __slots__ = [] def __eq__(s, o): return (s.time, s.priority) == (o.time, o.priority) def __lt__(s, o): return (s.time, s.priority) < (o.time, o.priority) def __le__(s, o): return (s.time, s.priority) <= (o.time, o.priority) def __gt__(s, o): return (s.time, s.priority) > (o.time, o.priority) def __ge__(s, o): return (s.time, s.priority) >= (o.time, o.priority)
其實很簡單,主要描述了事件的三個屬性:線程
time
)priority
)action
)這裏的argument
, kwargs
是動做的位置參數和關鍵字參數的字典,action(*argument, **kwargs)
code
用於安排一個事件Event
,該函數返回Event
的對象(可用於之後取消事件,見cancel
)time
:表示執行的絕對時間,與傳遞給__init__
函數的timefunc
函數的返回值兼容;priority
:事件的優先級,數字越小表示優先級越高;action
:事件的動做,即執行action(*argument, **kwargs)
。對象
安排延後delay
時間單位的事件。 其餘參數、效果和返回值與 enterabs()
的相同。blog
從隊列中刪除事件。 若是 event
不是當前隊列中的事件,則此方法將引起 ValueError
異常。隊列
判斷調度事件隊列是否爲空。事件
運行全部預約的事件。此方法默認阻塞等待下一個事件的執行,直到沒有更多的計劃事件。若是一個任務執行時間大於其餘任務的等待時間,那麼其餘任務會推遲任務的執行時間,這樣保證沒有任務丟失,但這些任務的調用時間會比設定的推遲。
若是 blocking
爲 False
,則執行因爲最快到期(若是有)的預約事件,而後在調度程序中返回下一個預約調用的截止時間(若是有)。
只讀屬性按照將要運行的順序返回即將發生的事件列表。 每一個事件都顯示爲 namedtuple
,包含如下字段:time
、priority
、action
、argument
、kwargs
。
這裏我就不舉例說明了,讀者根據須要自行編寫,下面貼出兩個例子供參考
Python標準庫sched模塊介紹
python使用多線程threading解決sched的阻塞問題