Python中的键盘可中断阻塞队列
看来Python中的键盘可中断阻塞队列,python,multithreading,concurrency,python-2.x,Python,Multithreading,Concurrency,Python 2.x,看来 import Queue Queue.Queue().get(timeout=10) 键盘是否可中断(ctrl-c)而 事实并非如此。我总是可以创建一个循环 import Queue q = Queue() while True: try: q.get(timeout=1000) except Queue.Empty: pass 但这似乎是一件奇怪的事情 那么,有没有一种方法可以获得一个无限期等待但键盘可中断的队列。get()?队列对
import Queue
Queue.Queue().get(timeout=10)
键盘是否可中断(ctrl-c)而
事实并非如此。我总是可以创建一个循环
import Queue
q = Queue()
while True:
try:
q.get(timeout=1000)
except Queue.Empty:
pass
但这似乎是一件奇怪的事情
那么,有没有一种方法可以获得一个无限期等待但键盘可中断的队列。get()?
队列
对象具有这种行为,因为它们使用条件
对象锁定线程
模块。所以你的解决方案是唯一的出路
但是,如果您确实需要一个Queue
方法来实现这一点,您可以monkeypatchQueue
类。例如:
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,因为常规函数似乎同样适用。这可能根本不适用于您的用例。但我已经在几个案例中成功地使用了这种模式:(略显粗糙,可能有问题,但你明白了)
啊,我明白了,这是一个很糟糕的漏洞百出的抽象案例*。啊.*为什么不将队列子类化,而不是对其进行Monkeypatching呢?当您接收到队列对象时,Monkeypatching会更好,这些对象是由您无法更改的第三方代码实例化并返回的,或者可能是由您也无法更改的同事代码实例化并返回的。但是,也许我应该使用子类化,因为这可能不是很常见。“
队列
对象具有这种行为,因为它们使用条件
对象锁定线程
模块。”我不确定为什么会出现这种情况。有人能给我解释一下或者给我指一个资源来解释这种行为吗?@joshreesjones,dimo414的评论是正确的。请参阅。线程是否可以以任何其他方式中断?这是一个以“不会修复”关闭的线程。建议的解决方法是在需要中断时始终指定超时。
interruptable_get(q)
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()