Python事件調(diào)度器

沒事逛了逛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í)很簡單郑气,主要描述了事件的三個屬性:

  1. 執(zhí)行時間(time
  2. 優(yōu)先級(priority
  3. 實(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è)定的推遲组砚。
    如果 blockingFalse 吻商,則執(zhí)行由于最快到期(如果有)的預(yù)定事件,然后在調(diào)度程序中返回下一個預(yù)定調(diào)用的截止時間(如果有)糟红。

  • scheduler.queue
    只讀屬性按照將要運(yùn)行的順序返回即將發(fā)生的事件列表艾帐。 每個事件都顯示為 namedtuple 乌叶,包含以下字段:timepriority柒爸、action准浴、argumentkwargs捎稚。

用例

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末今野,一起剝皮案震驚了整個濱河市葡公,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌条霜,老刑警劉巖催什,帶你破解...
    沈念sama閱讀 218,525評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異宰睡,居然都是意外死亡蒲凶,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評論 3 395
  • 文/潘曉璐 我一進(jìn)店門拆内,熙熙樓的掌柜王于貴愁眉苦臉地迎上來旋圆,“玉大人,你說我怎么就攤上這事矛纹”哿” “怎么了光稼?”我有些...
    開封第一講書人閱讀 164,862評論 0 354
  • 文/不壞的土叔 我叫張陵或南,是天一觀的道長。 經(jīng)常有香客問我艾君,道長采够,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,728評論 1 294
  • 正文 為了忘掉前任冰垄,我火速辦了婚禮蹬癌,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘虹茶。我一直安慰自己逝薪,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,743評論 6 392
  • 文/花漫 我一把揭開白布蝴罪。 她就那樣靜靜地躺著董济,像睡著了一般。 火紅的嫁衣襯著肌膚如雪要门。 梳的紋絲不亂的頭發(fā)上虏肾,一...
    開封第一講書人閱讀 51,590評論 1 305
  • 那天廓啊,我揣著相機(jī)與錄音,去河邊找鬼封豪。 笑死谴轮,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的吹埠。 我是一名探鬼主播第步,決...
    沈念sama閱讀 40,330評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼藻雌!你這毒婦竟也來了雌续?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,244評論 0 276
  • 序言:老撾萬榮一對情侶失蹤胯杭,失蹤者是張志新(化名)和其女友劉穎驯杜,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體做个,經(jīng)...
    沈念sama閱讀 45,693評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡鸽心,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,885評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了居暖。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片顽频。...
    茶點(diǎn)故事閱讀 40,001評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖太闺,靈堂內(nèi)的尸體忽然破棺而出糯景,到底是詐尸還是另有隱情,我是刑警寧澤省骂,帶...
    沈念sama閱讀 35,723評論 5 346
  • 正文 年R本政府宣布蟀淮,位于F島的核電站,受9級特大地震影響钞澳,放射性物質(zhì)發(fā)生泄漏怠惶。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,343評論 3 330
  • 文/蒙蒙 一轧粟、第九天 我趴在偏房一處隱蔽的房頂上張望策治。 院中可真熱鬧,春花似錦兰吟、人聲如沸通惫。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽履腋。三九已至,卻和暖如春拄丰,著一層夾襖步出監(jiān)牢的瞬間府树,已是汗流浹背俐末。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留奄侠,地道東北人卓箫。 一個月前我還...
    沈念sama閱讀 48,191評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像垄潮,于是被迫代替她去往敵國和親烹卒。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,955評論 2 355