我有一个PriorityQueue,其行为似乎总体上是明智的:
from Queue import PriorityQueue
pq = PriorityQueue()
pq.put((0, "hello"))
pq.put((0, "oh"))
pq.put((0, "h"))
如果我执行pq.get(),我会按以下顺序获取元素:
pq.get()
h
pq.get()
hello
pq.get()
oh
这很奇怪,它们都具有相同的优先级,但它们并没有按照它们的顺序给出。 有没有办法实现这个目标?
答案 0 :(得分:1)
优先级队列在元组上执行heapq排序(如注释中所指出的)(第一个值首先计数,当在第一个"列#34;中遇到相等时,它将比较第二个)
您得到结果,因为在排序字符串时,h < hello < oh
为True
。
优先级队列的构造函数。 maxsize是一个整数,用于设置可以放入队列的项目数的上限。达到此大小后,插入将阻止,直到消耗队列项。如果maxsize小于或等于零,则队列大小为无限。
您可能会考虑为实际优先级添加时间常量。例如。如果你有&#34;解决问题&#34;优先级为0,&#34;修复小错误&#34;优先级为1,每个任务中有更多任务,如果您真正关心订单,可以添加加权时间常数,或者只为任务数量添加一个非常小的值。
E.g。添加:
import time
pq.put((0 + time.time()*0.0000000001, "hello"))
pq.put((0 + time.time()*0.0000000001, "oh"))
pq.put((0 + time.time()*0.0000000001, "h"))
答案 1 :(得分:0)
来自docs:
首先检索最低值的条目(最低值条目是按排序(列表(条目))[0]返回的条目。
由于您还没有指定优先级,因此它会按数据的排序顺序返回它们。
如果要保留插入顺序,一种方法是保留插入计数器,并插入(count, item)
元组而不是原始项。