Как перебрать элементы Queue.Queue в Python? - PullRequest
30 голосов
/ 19 ноября 2011

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

Ответы [ 3 ]

39 голосов
/ 20 ноября 2011

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

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
10 голосов
/ 19 декабря 2017

Вывод списка элементов очереди без их использования:

>>> 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]
6 голосов
/ 04 марта 2016

Вы можете создать подкласс 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...