2011-11-19 17 views
16

öğesinin öğelerinin öğelerini yinelemeden silme işlemi, kuyruktan kaldırılır. İşlenecek öğelerin bir Queue.Queue kullanılarak geçirildiği bir üretici/tüketici türü programım var ve kalan öğelerin ne olduğunu yazdırabiliyorum. Herhangi bir fikir?Python'da Queue.Queue öğeleri nasıl yinelenir?

cevap

25

yapabilirsiniz temel veri deposunun bir kopyası üzerinde döngü: Bu Kuyruk nesneler için kilitleri atlar Satışlardaki

for elem in list(q.queue) 

, liste kopya bir atomik bir işlemdir ve bunun iyi bir sonuç olmalıdır.

Kilitleri tutmak istiyorsanız, neden tüm görevleri sıradan çekmeyin, liste kopyanızı hazırlayın ve sonra bunları geri koyun.

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

'Listedeki elem için (q.queue)' TypeError sonuçlanır: 'Queue' nesnesi Python 3'te yinelenmez '. Belki yanlış bir şey yapıyorum? –

+1

@ macmadness86 "q", Queue nesnesini barındıran bir "queue" özelliğine sahip kod nesnesi olan başka bir katmana sahipmiş gibi görünüyor. Bunu deneyin: '' listede elem için (q.queue.queue) ''. –

+0

Bunu yap. Uyulacak. Bahşiş için teşekkürler. (bu mesaj silinmek üzere planlanmıştır) –

2

Bir iş parçacığı güvenli bir şekilde bunu başarmak için queue.Queue alt sınıf:

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

İlanı kuyruğu bunları tüketen olmadan elemanlar: Operasyondan sonra

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

, yine de bunları işlemek olsun :

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