似乎
import Queue
Queue.Queue().get(timeout=10)
键盘可中断(ctrl-c)而
import Queue
Queue.Queue().get()
不是。我总是可以创建一个循环;
import Queue
q = Queue()
while True:
try:
q.get(timeout=1000)
except Queue.Empty:
pass
但这似乎很奇怪。
那么,有没有一种方法可以无限期地等待但是键盘可以中断Queue.get()?
答案 0 :(得分:6)
Queue
个对象具有此行为,因为它们使用Condition
模块中的threading
对象进行锁定。所以你的解决方案真的是唯一的出路。
但是,如果您真的想要一个Queue
方法来执行此操作,则可以对Queue
类进行monkeypatch。例如:
def interruptable_get(self):
while True:
try:
return self.get(timeout=1000)
except Queue.Empty:
pass
Queue.interruptable_get = interruptable_get
这会让你说
q.interruptable_get()
而不是
interruptable_get(q)
虽然在这种情况下Python社区通常不鼓励monkeypatching,因为常规函数看起来同样好。
答案 1 :(得分:4)
这可能根本不适用于您的用例。但是我在几种情况下成功地使用了这种模式:(粗略和可能的马车,但你明白了。)
STOP = object()
def consumer(q):
while True:
x = q.get()
if x is STOP:
return
consume(x)
def main()
q = Queue()
c=threading.Thread(target=consumer,args=[q])
try:
run_producer(q)
except KeybordInterrupt:
q.enqueue(STOP)
c.join()