variable valor usuario una teclado solicitar por obtener numeros numero introducir datos dato como capturar cadena python multithreading concurrency python-2.x

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.