2011-11-19 13 views
16

Czy ktoś zna pyton sposób iteracji elementów Queue.Queuebez usuwanie ich z kolejki. Mam program typu producent/konsument, w którym przedmioty do przetworzenia są przekazywane za pomocą numeru Queue.Queue i chcę móc wydrukować pozostałe elementy. Jakieś pomysły?Jak iterować elementy Queue.Queue w języku Python?

Odpowiedz

25

Można pętli nad kopią bazowego magazynu danych:

for elem in list(q.queue) 

Eventhough ten omija blokady dla obiektów kolejce, lista kopia jest operacją atomową i powinien wypracować w porządku.

Jeśli chcesz zachować blokady, może nie wyciągać wszystkich zadań z kolejki, tworzyć listę, a następnie je odkładać.

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 
+1

'dla elem na liście (q.queue)' powoduje 'TypeError: 'Obiekt kolejki nie jest iterable' w Pythonie 3. Być może robię coś nie tak? –

+1

@ macmadness86 Wygląda na to, że masz kolejną warstwę z "q" będącym obiektem kodu, który ma atrybut "queue", który przechowuje obiekt Queue. Spróbuj tego: '' dla elem na liście (q.queue.queue) ''. –

+0

Zgadzam się. Będzie zgodny. Dzięki za wskazówkę. (ta wiadomość jest zaplanowana do usunięcia) –

2

Można podklasy queue.Queue do osiągnięcia tego celu w wątku bezpieczny sposób:

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) 
0

elementów kolejek Zamieszczone bez ich spożywania:

>>> from Queue import Queue 
>>> q = Queue() 
>>> q.put(1) 
>>> q.put(2) 
>>> q.put(3) 
>>> print list(q.queue) 
[1, 2, 3] 

Po zakończeniu pracy, można się nadal je przetwarzać :

>>> q.get() 
1 
>>> print list(q.queue) 
[2, 3]