Подтвердить что ты не робот

Блокировка прерывания клавиатуры в Python

Кажется,

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

4b9b3361

Ответ 1

Queue объекты имеют такое поведение, потому что они блокируют использование Condition объектов из модуля threading. Таким образом, ваше решение - это единственный путь.

Однако, если вам действительно нужен способ Queue, который делает это, вы можете обезвредить класс 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)

хотя monkeypatching обычно обескураживается сообществом Python в таких случаях, поскольку регулярная функция кажется такой же хорошей.

Ответ 2

Это может не относиться к вашему случаю использования вообще. Но я успешно использовал этот шаблон в нескольких случаях: (отрывочный и вероятный багги, но вы понимаете).

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