我的应用程序中有两个线程。一个将值放在Queue
中,另一个将值从Queue
中拉出来并处理它们。
关闭应用程序时,我面临两难选择。处理Queue
中项目的线程仍然存在:
item = request_queue.get() # this call blocks until an item is available
唯一可以终止线程的是如果另一个项目被添加到Queue
- 并且因为主线程没有添加任何内容(因为它正在关闭),所以应用程序会锁定。
那么......即使Queue.get()
上没有任何内容,我怎样才能指示Queue
以某种方式返回?
答案 0 :(得分:9)
结果证明这很简单。选择一个对处理Queue
(None
非常理想的代码)的代码无效的值,然后将其推送到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()