Вопрос

Кажется,

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()
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top