2013-05-09 3 views
9

일반 파이썬 대기열처럼 파이썬에서 다중 처리 대기열을 지우는 방법을 알고 싶습니다. 예를 들어 :파이썬에서 다중 처리 대기열을 지우는 방법

from multiprocessing import Queue # multiprocessing queue 
from Queue import Queue   # normal queue 

multi_q = Queue() 
normal_q = Queue() 
multi_q.clear()     # or multi_q.queue.clear() 

'큐'객체는

normal_q.queue.clear() # This is ok 
+0

예 보통 대기열의 경우 normal_q.queue.clear()를 사용하여 내용을 정리할 수 있습니다. 그러나 다중 처리를 사용해야합니다. 답장을 보내 주셔서 감사합니다 – FelipeG

+5

이것은 기본적인 질문에 대한 답변이 아니지만 귀하의 질문에'import' 문이 서로 겹쳐 쓰는 것을 지적해야합니다. 위에서 작성한 코드를 사용한다면,'multi_q'와'normal_q'는 모두 보통의'Queue.Queue' 인스턴스가 될 것입니다. 모듈을 가져오고 클래스에 대해 정규화 된 이름 (예 :'multi_q = multiprocessing.Queue()')을 사용하거나'as' 키워드를 사용하여 다른 이름으로 가져와야합니다 (예 :'From Queue import Queue as qQueue'). – Blckknght

답변

1

'분명'더 갖는 속성 multiprocessing.Queue을 취소의 직접적인 방법은 없습니다가 없습니다.

나는 가장 가까운 수치가 close()이라고 생각하지만 단순히 그 대기열에 더 이상 데이터를 넣지 않을 것이라고 말하면서 모든 데이터가 파이프로 플러시되었을 때 닫을 것입니다.

+0

답장을 보내 주셔서 감사합니다. close()를 사용해 보았습니다.하지만 while 루프가있는 문제는 다음과 같습니다. while not someQueue.empty(): do something end process 그래서 다른 프로세스에서 대기열을 정리하여 while 루프가 종료됩니다. 하지만 대기열을 닫으면 오류가 발생합니다. – FelipeG

32

그래서, 큐 클래스에서 살펴보고, 당신은이 코드를 시도 할 수 있습니다

while not some_queue.empty(): 
    some_queue.get() # as docs say: Remove and return an item from the queue. 
+0

이 트릭이 작동하고 대답이 올바른 것입니다. – Raoul

+12

'some_queue.empty() :'가 아니라면 더 많은 pythonic입니다 – Jonathan

+2

이 답변은 실제로 "직접적인 방법이 없다"고 말하는 대신 실제로 해결책을 제시했기 때문에 선택해야합니다. – exfizik

1

인가 내장 당신이 원하는 방법 누락 클래스? 내장 클래스를 서브 클래스 화하고 거기에 있어야한다고 생각하는 메소드를 추가하십시오!

from Queue import Queue, Empty 

class ClearableQueue(Queue): 

    def clear(self): 
     try: 
      while True: 
       self.get_nowait() 
     except Empty: 
      pass 

귀하의 ClearableQueue 클래스는 당신이 지금 원하는 Queue 클래스 내장하고있는 방법의 모든 선하심 (행동)을 상속합니다.

q = Queue()을 사용하는 모든 곳에서 q = ClearableQueue()을 사용하고 q.clear()으로 전화하십시오.

+0

이 코드는 버그가 있습니다. 파이썬에서'get_nowait' 함수는 큐가 꽉 찼을지라도 (Empty) 함수를 던질 수 있기 때문입니다. –

+0

@ GeoffreyIrving : 파이썬에서 버그가 있다고 생각합니다. 예제 코드가 아닙니다! 진지하게 : * 문서화 된 기능을 언급하고 있습니까? 아니면이 메소드가 반환 할 때까지 누군가가 대기열에 다른 것을 밀어 넣을 수있는 경쟁 조건을 지적하고 있습니까? 어떤 경우에는 ... 음, 그렇습니다. 다중 스레드 처리는 이와 유사합니다. 하지만 여전히 제안 된 'clear()'구현의 버그는 아닙니다. –

관련 문제