【发布时间】:2017-12-25 14:45:16
【问题描述】:
我正在使用python的Queue.PriorityQueue,遇到了以下问题:当向队列中插入几个具有相同优先级的元素时,我希望队列按顺序为它们提供服务插入(FIFO)。出于某种原因,情况并非如此:
>>> from Queue import PriorityQueue
>>>
>>> j1 = (1, 'job1')
>>> j2 = (1, 'job2')
>>> j3 = (1, 'job3')
>>> j4 = (1, 'job4')
>>>
>>> q = PriorityQueue()
>>> q.put(j1)
>>> q.put(j2)
>>> q.put(j3)
>>> q.put(j4)
>>> q.queue
[(1, 'job1'), (1, 'job2'), (1, 'job3'), (1, 'job4')]
>>> q.get()
(1, 'job1')
>>> q.queue
[(1, 'job2'), (1, 'job4'), (1, 'job3')]
从例子中可以看出,在一个get()之后,顺序已经混杂了。
什么原因?如何克服(保持相同prio元素的顺序)?
编辑:
我被要求添加一个示例,表明 q.get() 实际上将 FIFO 排序搞砸了,所以这里有一个详细的示例:
class Job(object):
def __init__(self, type_, **data):
self.type_ = type_
self.priority = 0 if self.type_ == 'QUIT' else 1
self.data = data
def __cmp__(self, other):
return cmp(self.priority, other.priority)
def __repr__(self):
return 'Job("' + self.type_ + '", data=' + repr(self.data) + ')'
q = PriorityQueue()
q.put(Job('Build'))
q.put(Job('Clean'))
q.put(Job('QUIT'))
q.put(Job('Create'))
q.put(Job('Build'))
q.put(Job('Clean'))
现在我将逐个出列元素。预期结果:QUIT先出,后出,FIFO排序:Build、Clean、Create、Build、Clean:
>>> q.get()
Job("QUIT", data={})
>>> q.get()
Job("Build", data={})
>>> q.get()
Job("Clean", data={})
>>> q.get()
Job("Build", data={}) # <<---
>>> q.get()
Job("Clean", data={})
>>> q.get()
Job("Create", data={})
【问题讨论】:
-
您为什么会期望广告订单?
-
虽然不是完全相同的数据结构,但 OrderedDict 确实记得插入顺序。
-
@BradSolomon 为什么使用
python-2.7标签?它也发生在 Python 3 中。 -
@StefanPochmann 因为 PriorityQueue 是 Queue 的子类,所以我假设 FIFO,除非优先级获胜
-
@OmerDagan 好的,我想这是合理的。 (顺便说一句,请注意我在您接受后添加到我的答案中的第二段。)
标签: python priority-queue