Delayqueue (python 實現)

來源:互聯網
上載者:User

標籤:queue

起因:幾年前為了開發一個監控系統,需要周期性的對系統狀態進行檢查,因此需要對檢查任務進行添加,排隊(按時間),移除等操作,無意中發現java jdk 中有DelayQueue,因此實現了一個python版本

源碼如下:

# -*- coding:utf-8 -*-# python 版的 DelayQueue 類 和 Delayed 介面 # from Queue import PriorityQueuefrom datetime import datetimeimport threadingclass Delayed(object):    # 返回:計劃執行時間    # 單位: datetime    def plan_time(self):        passdef total_seconds(td):    return (td.microseconds + (td.seconds + td.days * 24 * 3600) * 10**6) / 10**6class DelayQueue(PriorityQueue):    def __init__(self, maxsize):        self.queue = []        # 如果任務沒有到達執行時間,則消費者必須等待在此condition上        self.lock = threading.Lock()        self.can_done = threading.Condition(self.lock)    def put_task(self, task):        self.put((task.plan_time, task))    # 檢索並移除此隊列的頭部,如果此隊列不存在未到期延遲的元素,則等待它     def take_task(self):        self.can_done.acquire()        try:            task = self.peek()            delta = total_seconds(task.plan_time - datetime.now())            while delta > 0:                self.can_done.wait(delta)                task = self.peek()                delta = total_seconds(task.plan_time - datetime.now())            item = self.get()            self.can_done.notify_all()            return item[1]        finally:            self.can_done.release()    def peek(self):        self.not_empty.acquire()        try:            while not self._qsize():                self.not_empty.wait()            return self.queue[0][1]        finally:            self.not_empty.release()

PS: python 中的 PriorityQueue基於 最小堆 演算法的,添加和移除一個元素的耗時都是log2(n)

著作權聲明:本文為博主原創文章,未經博主允許不得轉載。

Delayqueue (python 實現)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.