似乎

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()
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top