如何在Python中迭代Queue.Queue项?

如何在Python中迭代Queue.Queue项?,python,queue,producer-consumer,Python,Queue,Producer Consumer,有没有人知道一种pythonic方法可以迭代Queue.Queue中的元素而不将它们从队列中删除。我有一个生产者/消费者类型的程序,其中要处理的项目通过使用队列来传递。队列,我希望能够打印剩余的项目。有什么想法吗?您可以循环查看基础数据存储的副本: for elem in list(q.queue) 尽管这绕过了队列对象的锁,但列表副本是一个原子操作,应该可以正常工作 如果您想保留这些锁,为什么不将所有任务从队列中拉出,复制列表,然后将它们放回原处呢 mycopy = [] while Tru

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

您可以循环查看基础数据存储的副本:

for elem in list(q.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

您可以子类化
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)

列出队列元素而不使用它们:

>>> 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]

对于列表中的元素(q.queue)
会导致
TypeError:“queue”对象在Python 3中不可编辑。也许我做错了什么?@macmadness86看起来你有另一个层,“q”是代码对象,它有一个“queue”属性来保存队列对象。试试这个:
用于列表中的元素(q.queue.queue)
。收到。我会遵守的。谢谢你的提示。(已计划删除此邮件)