2011-05-13 78 views
4

我的應用程序中有兩個線程。一個將值放入Queue,另一個將其從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

我可以......但那樣會導致線程不乾淨關閉。 – 2011-05-13 06:23:28

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() 
相關問題