2011-05-13 12 views
4

私のアプリケーションには2つのスレッドがあります。 Queueに値を入れ、もう1つはQueueから値を取り出して処理します。このスレッドをキューで待機させる方法を終了しますか?

私はアプリケーションをシャットダウンするときにジレンマに直面しています。 Queueの項目を処理するスレッドがに貼り付ける:

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

別の項目がQueueに追加された場合、スレッドを終了する唯一のものである - そしてそれはだから、メインスレッドが(何も追加されませんので、シャットダウン)、アプリケーションはロックされます。

... Queueに何もない場合でも、何とか返すようにQueue.get()に指示するにはどうすればよいですか?

答えて

7

答えは非常に簡単です。 QueueNoneが理想的です)を処理するコードで無効な値を選択し、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(真の)答えは普遍的解決策ではありません。

たとえば、このスクリプトは、Ctrlキーを押しながらC

#!/usr/bin/python 
import Queue 

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

むしろよりQueue.get(上タイムアウトを置く)で停止することはできませんし、例外を扱う何かがあるまでは、簡単な解決策は、待ちループを実行することですそこ。このスクリプトは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() 
関連する問題