öğ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?
16
A
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
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]
'Listedeki elem için (q.queue)' TypeError sonuçlanır: 'Queue' nesnesi Python 3'te yinelenmez '. Belki yanlış bir şey yapıyorum? –
@ 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) ''. –
Bunu yap. Uyulacak. Bahşiş için teşekkürler. (bu mesaj silinmek üzere planlanmıştır) –