如何让这个线程等待队列退出?

时间:2011-05-13 04:37:12

标签: python multithreading queue

我的应用程序中有两个线程。一个将值放在Queue中,另一个将值从Queue中拉出来并处理它们。

关闭应用程序时,我面临两难选择。处理Queue中项目的线程仍然存在:

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

唯一可以终止线程的是如果另一个项目被添加到Queue - 并且因为主线程没有添加任何内容(因为它正在关闭),所以应用程序会锁定。

那么......即使Queue.get()上没有任何内容,我怎样才能指示Queue以某种方式返回?

3 个答案:

答案 0 :(得分:9)

结果证明这很简单。选择一个对处理QueueNone非常理想的代码)的代码无效的值,然后将其推送到Queue。然后让Queue处理线程在获得值时退出:

while True:

    item = request_queue.get()

    if item is None:
        break

    # process the Queue as per normal...

答案 1 :(得分: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)

答案 2 :(得分:0)

如果在主线程中调用Queue.get(),仍会出现此问题 - 因此setDaemon(True)答案不是通用解决方案。

例如,无法使用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()