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
方法来实现这一点,您可以monkeypatch
Queue
类。例如:

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()