Python事件調度器

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

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

  1. 執行時間(time
  2. 優先級(priority
  3. 實際要做的事情(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)
    運行所有預定的事件。此方法默認阻塞等待下一個事件的執行,直到沒有更多的計劃事件。如果一個任務執行時間大于其他任務的等待時間,那么其他任務會推遲任務的執行時間,這樣保證沒有任務丟失,但這些任務的調用時間會比設定的推遲。
    如果 blockingFalse ,則執行由于最快到期(如果有)的預定事件,然后在調度程序中返回下一個預定調用的截止時間(如果有)。

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

用例

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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。