Pergunta

Parece

import Queue

Queue.Queue().get(timeout=10)

é interruptível teclado (ctrl-c), enquanto

import Queue

Queue.Queue().get()

não é. Eu sempre poderia criar um laço;

import Queue
q = Queue()

while True:
    try:
        q.get(timeout=1000)
    except Queue.Empty:
        pass

mas esta parece ser uma coisa estranha a fazer.

Assim, há uma maneira de conseguir um teclado indefinidamente à espera, mas interruptível Queue.get ()?

Foi útil?

Solução

objetos Queue tem esse comportamento porque eles bloquear o uso de objetos Condition formar o módulo threading. Então a solução é realmente a única maneira de ir.

No entanto, se você realmente quer um método Queue que faz isso, você pode monkeypatch a classe Queue. Por exemplo:

def interruptable_get(self):
    while True:
        try:
            return self.get(timeout=1000)
        except Queue.Empty:
            pass
Queue.interruptable_get = interruptable_get

Este iria deixá-lo dizer

q.interruptable_get()

em vez de

interruptable_get(q)

embora monkeypatching é geralmente desencorajado pela comunidade Python em casos como estes, uma vez que uma função regular parece tão bom.

Outras dicas

Isto pode não se aplicar ao seu caso de uso em tudo. Mas eu tenho usado com sucesso esse padrão em vários casos:. (Buggy esboçado e provável, mas você começa o ponto)

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()
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top