12

它似乎

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

4

2 回答 2

6

QueueCondition对象具有这种行为是因为它们使用模块中的对象进行锁定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 社区通常不鼓励在此类情况下使用猴子补丁,因为常规函数似乎也一样好。

于 2008-10-17T17:01:03.880 回答
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()
于 2008-10-19T17:40:36.280 回答