Как перебирать элементы Queue.Queue в Python?

Кто-нибудь знает питоновский способ итерации над элементами Queue.Queue, не удаляя их из очереди. У меня есть программа производителя/потребителя, где элементы, которые нужно обработать, передаются с помощью Queue.Queue, и я хочу иметь возможность печатать, что представляют собой остальные элементы. Любые идеи?

Ответы

Ответ 1

Вы можете скопировать копию базового хранилища данных:

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

Ответ 2

Вы можете подклассифицировать 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)

Ответ 3

Элементы списка листинга без их использования:

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