Python中如何实现带优先级、延迟和超时的队列

2023-04-11 00:00:00 优先级 队列 超时

可以使用Python内置的heapq模块来实现带优先级的队列:

import time
import heapq

class PriorityQueueWithDelay:
    def __init__(self):
        self.queue = []
        self.delayed = []
        self.counter = 0

    def push(self, item, priority, delay):
        entry = (priority, self.counter, item, time.time() + delay)
        heapq.heappush(self.queue, entry)
        self.counter += 1

    def pop(self):
        while self.delayed and self.delayed[0][0] < time.time():
            _, _, item = heapq.heappop(self.delayed)
            heapq.heappush(self.queue, item)
        if self.queue:
            priority, _, item, _ = heapq.heappop(self.queue)
            return item
        return None

    def delay(self, item, priority, delay):
        entry = (time.time() + delay, self.counter, (priority, item))
        heapq.heappush(self.delayed, entry)
        self.counter += 1

    def __len__(self):
        return len(self.queue) + len(self.delayed)

这个优先级队列还实现了延迟和超时功能。 具体来说,使用 push 方法将项添加到队列中,指定优先级和延迟。如果您需要在一段时间后将项移动到队列前面(用于延迟),则可以使用 delay 方法。要检索队列中具有最高优先级的项,请使用 pop 方法。如果存在延迟项,则它们将首先被处理。如果没有任何项在队列中,则 pop 方法会返回 None

具体来说,以下代码演示了如何使用这个优先级队列:

queue = PriorityQueueWithDelay()

queue.push('pidancode.com', 1, 0)
queue.push('皮蛋编程', 2, 0)
queue.push('Python', 1, 0.5)

time.sleep(1)
print(queue.pop()) # 'pidancode.com'

queue.delay('Python', 1, 0.5)

time.sleep(1)
print(queue.pop()) # 'Python'

time.sleep(1)
print(queue.pop()) # '皮蛋编程'

相关文章