Python 2.7:PriorityQueue中的意外行为

时间:2015-04-18 22:15:07

标签: python python-2.7

我有一个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

这很奇怪,它们都具有相同的优先级,但它们并没有按照它们的顺序给出。 有没有办法实现这个目标?

2 个答案:

答案 0 :(得分:1)

优先级队列在元组上执行heapq排序(如注释中所指出的)(第一个值首先计数,当在第一个"列#34;中遇到相等时,它将比较第二个)

您得到结果,因为在排序字符串时,h < hello < ohTrue

来自documentation

  

优先级队列的构造函数。 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)元组而不是原始项。