Python中如何实现带优先级、延迟和超时的队列
可以使用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()) # '皮蛋编程'
相关文章