Python: 时间优先的优先队列
Python: priority queue with time as priority
我使用 heaps
构建了一个优先级队列。队列包含消息,这些消息应该按照优先级的顺序发送。但是,作为优先级值,我有一个时间应该发送消息,例如我必须放入队列的一组消息:
(10, message1)
(15, message2)
(5, message3)
所以按照优先级发送消息很容易。但是,如果我在将 messag3
放入队列 5 秒后首先发送它,我想确保下一条消息 message1
将在放入队列后 10 秒发送,发送 message3
后 5 秒的内容。有谁知道我如何做到这一点的例子吗?
您可以使用纪元作为优先级值,每次计时器触发时都会根据当前时间计算何时再次触发。这是实践中的一个简短示例:
import calendar
import time
import heapq
from threading import Timer
def epoch():
return calendar.timegm(time.gmtime())
start_time = epoch()
heap = []
timer = None
def add_message(seconds, content):
top = heap[0] if heap else None
heapq.heappush(heap, (epoch() + seconds, content))
if timer and top != heap[0]:
timer.cancel()
start()
def start():
global timer
if heap:
timer = Timer(heap[0][0] - epoch(), fire)
timer.start()
def fire():
_, message = heapq.heappop(heap)
print '{}: {}'.format(epoch() - start_time, message)
start()
add_message(10, 'message1')
add_message(15, 'message2')
add_message(5, 'message3')
start()
add_message(1, 'message4')
输出:
1: message4
5: message3
10: message1
15: message2
我使用 heaps
构建了一个优先级队列。队列包含消息,这些消息应该按照优先级的顺序发送。但是,作为优先级值,我有一个时间应该发送消息,例如我必须放入队列的一组消息:
(10, message1)
(15, message2)
(5, message3)
所以按照优先级发送消息很容易。但是,如果我在将 messag3
放入队列 5 秒后首先发送它,我想确保下一条消息 message1
将在放入队列后 10 秒发送,发送 message3
后 5 秒的内容。有谁知道我如何做到这一点的例子吗?
您可以使用纪元作为优先级值,每次计时器触发时都会根据当前时间计算何时再次触发。这是实践中的一个简短示例:
import calendar
import time
import heapq
from threading import Timer
def epoch():
return calendar.timegm(time.gmtime())
start_time = epoch()
heap = []
timer = None
def add_message(seconds, content):
top = heap[0] if heap else None
heapq.heappush(heap, (epoch() + seconds, content))
if timer and top != heap[0]:
timer.cancel()
start()
def start():
global timer
if heap:
timer = Timer(heap[0][0] - epoch(), fire)
timer.start()
def fire():
_, message = heapq.heappop(heap)
print '{}: {}'.format(epoch() - start_time, message)
start()
add_message(10, 'message1')
add_message(15, 'message2')
add_message(5, 'message3')
start()
add_message(1, 'message4')
输出:
1: message4
5: message3
10: message1
15: message2