Python中的键盘可中断阻塞队列
-
03-07-2019 - |
题
似乎
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()?
解决方案
Queue
对象具有此行为,因为它们使用条件
对象从 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,因为常规函数看起来同样好。
其他提示
这可能根本不适用于您的用例。但是我在几种情况下成功地使用了这种模式:(粗略和可能的马车,但你明白了。)
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()
不隶属于 StackOverflow