2011-11-19 3 views
16

누구든지 Queue.Queue의 요소를 반복하는 비유의 방법을 알고 있습니까 () 큐에서 제거하지 않습니다. 나는 처리 할 항목이 Queue.Queue을 사용하여 전달되는 생산자/소비자 유형 프로그램이 있으며 나머지 항목이 무엇인지 인쇄 할 수 있기를 원합니다. 어떤 아이디어?Python에서 Queue.Queue 항목을 반복하는 방법은 무엇입니까?

답변

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

'for elem in list (q.queue)'는'TypeError :'Queue '객체는 파이썬 3에서 반복 가능하지 않습니다. 아마도 내가 잘못된 것을하고 있습니까? –

+1

@ macmadness86 "q"가 Queue 객체를 보유하는 "queue"속성을 가진 코드 객체 인 다른 레이어가있는 것처럼 보입니다. 이것을보십시오 :''elem in list (q.queue.queue)''. –

+0

로저 그. 윌 준수합니다. 팁 고마워. (이 메시지는 삭제 예정입니다) –

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]