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

pgi*_*mon 33 python queue producer-consumer

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

Ray*_*ger 40

您可以循环访问基础数据存储的副本:

for elem in list(q.queue)
Run Code Online (Sandbox Code Playgroud)

虽然这绕过了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
Run Code Online (Sandbox Code Playgroud)

  • 对于list(q.queue)中的elem,导致在Python 3中出现TypeError:'Queue'对象不可迭代。也许我做错了什么? (2认同)
  • @ macmadness86好像您有另一个层,其中“ q”是代码对象,具有“ queue”属性,该属性包含一个Queue对象。试试这个:``对于列表(q.queue.queue)中的元素''。 (2认同)

Ome*_*gan 12

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

>>> from Queue import Queue
>>> q = Queue()
>>> q.put(1)
>>> q.put(2)
>>> q.put(3)
>>> print list(q.queue)
[1, 2, 3]
Run Code Online (Sandbox Code Playgroud)

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

>>> q.get()
1
>>> print list(q.queue)
[2, 3]
Run Code Online (Sandbox Code Playgroud)


Erw*_*yer 6

您可以通过子类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)
Run Code Online (Sandbox Code Playgroud)