沒事逛了逛python
標(biāo)準(zhǔn)庫,看的了一個很有意思的模塊(sched
)溉箕,十分簡短,讀起來也比較容易悦昵,整個模塊加上注釋一共才100
多行代碼肴茄,功能卻相當(dāng)強(qiáng)大,總結(jié)出來跟大家分享一下但指。
介紹
python
標(biāo)準(zhǔn)庫提供了一個sched
模塊寡痰,它定義了一個實(shí)現(xiàn)通用事件調(diào)度程序的類抗楔。在介紹其用法之前,我們先看一眼它的源碼是什么樣子氓癌。
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
上面是它所有的方法和屬性了谓谦,沒錯,就這么簡潔贪婉,為了方便預(yù)覽反粥,這里把實(shí)現(xiàn)給省略了。下面我們逐一介紹各個方法和屬性疲迂。
-
事件
在詳細(xì)介紹這些API之前才顿,我先看一看scheduler
類,內(nèi)部用到的事件(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)
其實(shí)很簡單郑气,主要描述了事件的三個屬性:
- 執(zhí)行時間(
time
) - 優(yōu)先級(
priority
) - 實(shí)際要做的事情(
action
)
這里的argument
,kwargs
是動作的位置參數(shù)和關(guān)鍵字參數(shù)的字典,action(*argument, **kwargs)
方法和屬性
scheduler.enterabs(time, priority, action, argument=(), kwargs={})
用于安排一個事件Event
腰池,該函數(shù)返回Event
的對象(可用于以后取消事件尾组,見cancel
)
time
:表示執(zhí)行的絕對時間,與傳遞給__init__
函數(shù)的timefunc
函數(shù)的返回值兼容示弓;
priority
:事件的優(yōu)先級讳侨,數(shù)字越小表示優(yōu)先級越高;
action
:事件的動作奏属,即執(zhí)行action(*argument, **kwargs)
跨跨。scheduler.enter(delay, priority, action, argument=(), kwargs={})
安排延后delay
時間單位的事件。 其他參數(shù)囱皿、效果和返回值與enterabs()
的相同勇婴。scheduler.cancel(event)
從隊(duì)列中刪除事件。 如果event
不是當(dāng)前隊(duì)列中的事件嘱腥,則此方法將引發(fā)ValueError
異常耕渴。scheduler.empty()
判斷調(diào)度事件隊(duì)列是否為空。scheduler.run(blocking=True)
運(yùn)行所有預(yù)定的事件齿兔。此方法默認(rèn)阻塞等待下一個事件的執(zhí)行萨螺,直到?jīng)]有更多的計(jì)劃事件。如果一個任務(wù)執(zhí)行時間大于其他任務(wù)的等待時間愧驱,那么其他任務(wù)會推遲任務(wù)的執(zhí)行時間慰技,這樣保證沒有任務(wù)丟失,但這些任務(wù)的調(diào)用時間會比設(shè)定的推遲组砚。
如果blocking
為False
吻商,則執(zhí)行由于最快到期(如果有)的預(yù)定事件,然后在調(diào)度程序中返回下一個預(yù)定調(diào)用的截止時間(如果有)糟红。
-
scheduler.queue
只讀屬性按照將要運(yùn)行的順序返回即將發(fā)生的事件列表艾帐。 每個事件都顯示為namedtuple
乌叶,包含以下字段:time
、priority
柒爸、action
准浴、argument
、kwargs
捎稚。
用例
這里我就不舉例說明了乐横,讀者根據(jù)需要自行編寫,下面貼出兩個例子供參考
Python標(biāo)準(zhǔn)庫sched模塊介紹
python使用多線程threading解決sched的阻塞問題