2011-05-13 3 views
4

내 응용 프로그램에 두 개의 스레드가 있습니다. 하나는 Queue에 값을 넣고 다른 하나는 Queue에서 값을 가져와 처리합니다.이 스레드가 대기열에서 대기하도록하려면 어떻게합니까?

응용 프로그램을 종료 할 때 딜레마에 직면했습니다. Queue에서 항목을 처리하는 스레드에 붙어 :

item = request_queue.get() # this call blocks until an item is available 

스레드가 다른 항목이 Queue에 추가 된 경우입니다 종료됩니다 유일한 것은 - 그리고 그것을이기 때문에 메인 스레드가 (아무것도 추가하지 않기 때문에 종료) 응용 프로그램이 잠 깁니다.

그래서 ... Queue에 아무 것도없는 경우에도 어떻게 든 반환하도록 Queue.get()에게 지시 할 수 있습니까?

답변

7

답은 매우 간단합니다. Queue을 처리하는 코드 (None이 이상적)에 대해 유효하지 않은 값을 선택하고 Queue으로 푸시합니다. 그런 다음이 값을 가져옵니다 때 Queue 처리 스레드가 종료가 : 차단 스레드가 메인 스레드가 아닌

while True: 

    item = request_queue.get() 

    if item is None: 
     break 

    # process the Queue as per normal... 
1

때문에, 당신은 또한 .daemon = True을 설정할 수 있습니다.

import time 
import threading 
from Queue import Queue 

def getter(q): 
    while True: 
     print 'getting...' 
     print q.get(), 'gotten' 

def putter(q): 
    for i in range(10): 
     time.sleep(0.5) 
     q.put(i) 
     time.sleep(0.5) 

q = Queue() 
get_thread = threading.Thread(target=getter, args=(q,)) 
get_thread.daemon = True 
get_thread.start() 

putter(q) 
+0

할 수는 있지만 ... 그 스레드의 부정한 종료가 발생합니다. –

0

Queue.get()가 메인 스레드에서 호출되는 경우이 문제가 계속 발생할 수 있습니다 - 그래서 setDaemon를 (참) 대답은 보편적 인 해결책이 아니다.

예를 들어이 스크립트가 Queue.get (에 시간 제한을 가하고) 및 예외 처리보다

#!/usr/bin/python 
import Queue 

theQ = Queue.Queue() 
print "one thread getting from Queue" 
print theQ.get() 

오히려 Ctrl-C를 함께 중지 할 수있는 간단한 해결책은 무엇인가 될 때까지 대기 루프를하는 것입니다 그곳에. 이 스크립트는 Ctrl-C로 살릴 수 있습니다

#!/usr/bin/python 
import Queue 
theQ = Queue.Queue() 
print "one thread getting from Queue" 
while theQ.empty(): 
    time.sleep(0.01) # or whatever value is appropriate for your event arrivals 
print theQ.get() 
관련 문제