valor - Cola de bloqueo interrumpible del teclado en Python
introducir un valor en python (2)
Parece
import Queue
Queue.Queue().get(timeout=10)
es el teclado interrumpible (ctrl-c) mientras que
import Queue
Queue.Queue().get()
no es. Siempre podría crear un bucle;
import Queue
q = Queue()
while True:
try:
q.get(timeout=1000)
except Queue.Empty:
pass
pero esto parece una cosa extraña de hacer.
Entonces, ¿hay alguna forma de obtener una espera indefinida pero el teclado interrumpible Queue.get ()?
Esto puede no aplicarse a su caso de uso en absoluto. Pero he utilizado con éxito este patrón en varios casos: (impreciso y probablemente con errores, pero entiendes el punto).
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()
Queue
objetos Queue
tienen este comportamiento porque se bloquean usando objetos Condition
desde el módulo threading
. Entonces, tu solución es realmente la única manera de hacerlo.
Sin embargo, si realmente quiere un método Queue
que haga esto, puede monopatchear la clase Queue
. Por ejemplo:
def interruptable_get(self):
while True:
try:
return self.get(timeout=1000)
except Queue.Empty:
pass
Queue.interruptable_get = interruptable_get
Esto te dejaría decir
q.interruptable_get()
en lugar de
interruptable_get(q)
aunque la comunidad de Python suele desalentar el monopatching en casos como estos, ya que una función regular parece igual de buena.