我想获取队列中的下一个项目,但是我不想将其出队。在Python的queue.PriorityQueue
中是否可以实现?根据文档,我没有看到如何实现。
a.queue[0]
获取下一个项目:from queue import PriorityQueue
a = PriorityQueue()
a.put((10, "a"))
a.put((4, "b"))
a.put((3,"c"))
print(a.queue[0])
print(a.queue)
print(a.get())
print(a.queue)
print(a.get())
print(a.queue)
输出结果为:
(3, 'c')
[(3, 'c'), (10, 'a'), (4, 'b')]
(3, 'c')
[(4, 'b'), (10, 'a')]
(4, 'b')
[(10, 'a')]
但要注意多线程访问的问题。
for i in range(len(queue.queue)):
print queue.queue[i]
这不会弹出任何东西。
如果您希望按优先顺序进行排序,请使用:
for i in range(len(queue.queue)):
temp = queue.get()
queue.put(temp)
print temp
((temp1,temp2))
def peek(pq):
return pq.queue[0][1]
根据理论,当您从队列中取出项目时,它将从队列中删除。您需要编写自己的函数,该函数可以为您提供PriorityQueue的最后一个元素。您可以通过继承priorityqueue来创建peek函数。
简而言之 -- 如果您在多线程环境中多次使用顶部项目,则应将该项目分配给变量。
以上答案展示了如何访问PriorityQueue的元素,然而在多线程方式下从内部队列中访问对象存在一定的危险(正如HYRY's answer末尾所提到的)。
虽然持有queue
对象会更不安全,因为该queue
对象是“活动的”(参见this answer),但如果您期望对象排序是静态的,则仍可能遇到访问队列上的对象时出现问题。
以下是一个例子:
from queue import PriorityQueue
import threading
import time
pq = PriorityQueue()
def queue_manip():
i = 0
while True:
pq.put((i, i))
i -= 1
time.sleep(.1)
t1 = threading.Thread(target=queue_manip)
t1.start()
while True:
print('FirstAccess: ', pq.queue[0])
time.sleep(.2) # other processing
print('SecondAccess: ', pq.queue[0])
time.sleep(.2) # other processing
print()
这将会打印出类似下面的内容:
FirstAccess: (0, 0)
SecondAccess: (-1, -1)
FirstAccess: (-3, -3)
SecondAccess: (-5, -5)
FirstAccess: (-7, -7)
SecondAccess: (-9, -9)
因此,如果您想使用来自PriorityQueue
顶部的对象,您应该将该对象分配一个名称:
from queue import PriorityQueue
import threading
import time
pq = PriorityQueue()
def queue_manip():
i = 0
while True:
pq.put((i, i))
i -= 1
time.sleep(.1)
t1 = threading.Thread(target=queue_manip)
t1.start()
while True:
priority, item = pq.queue[0]
print('FirstUse: ', item)
time.sleep(.2) # other processing
print('SecondUse: ', item)
time.sleep(.2) # other processing
print()
这将为您提供:
FirstUse: 0
SecondUse: 0
FirstUse: -3
SecondUse: -3
FirstUse: -7
SecondUse: -7
q
是优先队列,那么可以使用以下代码:for i in range(q.qsize()):
print(q.queue[i])
q.queue[0]
返回队列中最高优先级的项目,但q.queue[1]
不一定返回第二高优先级的项目。 - Rufusq.queue[1]
或者q.queue[2]
。这是因为父节点(q.queue[0]
在本例中)必须具有比它的两个子节点(q.queue[1]
和q.queue[2]
)更高的优先级,但这两个子节点的特定顺序并不重要。这意味着整个q.queue
不是绝对排序的,只是“堆”排序(即每个层级都具有比它下面的层级更高的优先级)。 - Marawan Okashaa.queue
作为存储器。列表是队列在内存中以明文形式存储的方式。只要队列被构建,列表就必须存在。直接访问列表会绕过整个队列的逻辑,直接进入其存储。 - fokia.queue[0]
是常数时间。 - foki