Клавиатура прерывистой блокировки очереди в Python
-
03-07-2019 - |
Вопрос
Кажется,
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
имеют такое поведение, потому что они блокируются с использованием объектов 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)
Несмотря на то, что в таких случаях сообщество 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()