如何迭代Queue.Python中的队列项



有没有人知道一种python的方法来迭代Queue.Queue 的元素,而不将从队列中删除?我有一个生产者/消费者类型的程序,其中要处理的项目通过使用Queue.Queue传递,并且我希望能够打印剩余的项目是什么。什么好主意吗?

您可以遍历底层数据存储的副本:

for elem in list(q.queue)

尽管这绕过了Queue对象的锁,但列表复制是一个原子操作,应该可以很好地完成。

如果你想保留锁,为什么不把所有的任务从队列中拉出来,复制你的列表,然后把它们放回去。

mycopy = []
while True:
     try:
         elem = q.get(block=False)
     except Empty:
         break
     else:
         mycopy.append(elem)
for elem in mycopy:
    q.put(elem)
for elem in mycopy:
    # do something with the elements

列出未使用的队列元素:

>>> from Queue import Queue
>>> q = Queue()
>>> q.put(1)
>>> q.put(2)
>>> q.put(3)
>>> print list(q.queue)
[1, 2, 3]

操作后,您仍然可以处理它们:

>>> q.get()
1
>>> print list(q.queue)
[2, 3]

您可以子类化queue.Queue以线程安全的方式实现此目的:

import queue

class ImprovedQueue(queue.Queue):
    def to_list(self):
        """
        Returns a copy of all items in the queue without removing them.
        """
        with self.mutex:
            return list(self.queue)

您可以在打印元素之前将deque转换为列表,以便您可以轻松地遍历它。

from collections import deque
d = deque([7,9,3,5])
d.append(2)
d.appendleft(1)
d.append(10)
d.pop()
for elem in list(d):
    print(elem, end=" ")
#Output: 1 7 9 3 5 2 

最新更新