Python事件調度器

沒事逛了逛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)

其實很簡單,主要描述了事件的三個屬性:線程

  1. 執行時間(time
  2. 優先級(priority
  3. 實際要作的事情(action

這裏的argument, kwargs是動做的位置參數和關鍵字參數的字典,action(*argument, **kwargs)code

方法和屬性

  • 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()的相同。blog

  • scheduler.cancel(event)

從隊列中刪除事件。 若是 event 不是當前隊列中的事件,則此方法將引起 ValueError 異常。隊列

  • scheduler.empty()

判斷調度事件隊列是否爲空。事件

  • scheduler.run(blocking=True)

運行全部預約的事件。此方法默認阻塞等待下一個事件的執行,直到沒有更多的計劃事件。若是一個任務執行時間大於其餘任務的等待時間,那麼其餘任務會推遲任務的執行時間,這樣保證沒有任務丟失,但這些任務的調用時間會比設定的推遲。
若是 blockingFalse ,則執行因爲最快到期(若是有)的預約事件,而後在調度程序中返回下一個預約調用的截止時間(若是有)。

  • scheduler.queue

只讀屬性按照將要運行的順序返回即將發生的事件列表。 每一個事件都顯示爲 namedtuple ,包含如下字段:timepriorityactionargumentkwargs

用例

這裏我就不舉例說明了,讀者根據須要自行編寫,下面貼出兩個例子供參考
Python標準庫sched模塊介紹
python使用多線程threading解決sched的阻塞問題

相關文章
相關標籤/搜索