Python中的键盘可中断阻塞队列

时间:2008-10-17 16:10:52

标签: python multithreading concurrency python-2.x

似乎

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

2 个答案:

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