沒事逛了逛python
標準庫,看的了一個很有意思的模塊(sched
),十分簡短,讀起來也比較容易,整個模塊加上注釋一共才100
多行代碼,功能卻相當強大,總結出來跟大家分享一下。
介紹
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
)對象是什么,看看定義
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)
方法和屬性
scheduler.enterabs(time, priority, action, argument=(), kwargs={})
用于安排一個事件Event
,該函數返回Event
的對象(可用于以后取消事件,見cancel
)
time
:表示執行的絕對時間,與傳遞給__init__
函數的timefunc
函數的返回值兼容;
priority
:事件的優先級,數字越小表示優先級越高;
action
:事件的動作,即執行action(*argument, **kwargs)
。scheduler.enter(delay, priority, action, argument=(), kwargs={})
安排延后delay
時間單位的事件。 其他參數、效果和返回值與enterabs()
的相同。scheduler.cancel(event)
從隊列中刪除事件。 如果event
不是當前隊列中的事件,則此方法將引發ValueError
異常。scheduler.empty()
判斷調度事件隊列是否為空。scheduler.run(blocking=True)
運行所有預定的事件。此方法默認阻塞等待下一個事件的執行,直到沒有更多的計劃事件。如果一個任務執行時間大于其他任務的等待時間,那么其他任務會推遲任務的執行時間,這樣保證沒有任務丟失,但這些任務的調用時間會比設定的推遲。
如果blocking
為False
,則執行由于最快到期(如果有)的預定事件,然后在調度程序中返回下一個預定調用的截止時間(如果有)。
-
scheduler.queue
只讀屬性按照將要運行的順序返回即將發生的事件列表。 每個事件都顯示為namedtuple
,包含以下字段:time
、priority
、action
、argument
、kwargs
。
用例
這里我就不舉例說明了,讀者根據需要自行編寫,下面貼出兩個例子供參考
Python標準庫sched模塊介紹
python使用多線程threading解決sched的阻塞問題