누구든지 Queue.Queue
의 요소를 반복하는 비유의 방법을 알고 있습니까 () 큐에서 제거하지 않습니다. 나는 처리 할 항목이 Queue.Queue
을 사용하여 전달되는 생산자/소비자 유형 프로그램이 있으며 나머지 항목이 무엇인지 인쇄 할 수 있기를 원합니다. 어떤 아이디어?Python에서 Queue.Queue 항목을 반복하는 방법은 무엇입니까?
16
A
답변
25
당신이 할 수있는 기본 데이터 저장소의 복사본 돌이 :이 큐 개체의 잠금을 우회 그겁니다
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
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)
0
목록 큐를 사용하지 않고 요소 : 수술 후
>>> 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]
'for elem in list (q.queue)'는'TypeError :'Queue '객체는 파이썬 3에서 반복 가능하지 않습니다. 아마도 내가 잘못된 것을하고 있습니까? –
@ macmadness86 "q"가 Queue 객체를 보유하는 "queue"속성을 가진 코드 객체 인 다른 레이어가있는 것처럼 보입니다. 이것을보십시오 :''elem in list (q.queue.queue)''. –
로저 그. 윌 준수합니다. 팁 고마워. (이 메시지는 삭제 예정입니다) –