Как перебирать элементы 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]