Блокировка прерывания клавиатуры в 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()?
Ответы
Ответ 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()