2011-05-13 39 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() 
相关问题