Teclado fila de bloqueio susceptível de interrupção em Python
-
03-07-2019 - |
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 ()?
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()