Tastatur unterbrechbaren Sperr Warteschlange in Python
-
03-07-2019 - |
Frage
Es scheint,
import Queue
Queue.Queue().get(timeout=10)
ist Tastatur unterbrechbare (ctrl-c) während
import Queue
Queue.Queue().get()
ist es nicht. Ich konnte immer eine Schleife erstellen;
import Queue
q = Queue()
while True:
try:
q.get(timeout=1000)
except Queue.Empty:
pass
aber dies scheint wie eine seltsame Sache zu tun.
So, ist es eine Möglichkeit, eine unbestimmte Zeit zu bekommen warten aber Tastatur unterbrechbare Queue.get ()?
Lösung
Queue
Objekte haben dieses Verhalten, weil sie das Condition
Modul threading
Objekte sperren bilden. So Ihre Lösung ist wirklich der einzige Weg zu gehen.
Wenn Sie jedoch wirklich eine Queue
Methode wollen, dass dies der Fall ist, können Sie die Queue
Klasse monkeypatch. Zum Beispiel:
def interruptable_get(self):
while True:
try:
return self.get(timeout=1000)
except Queue.Empty:
pass
Queue.interruptable_get = interruptable_get
Dies würde Sie sagen
q.interruptable_get()
statt
interruptable_get(q)
obwohl monkeypatching im Allgemeinen durch die Python-Gemeinschaft in Fällen wie diesen wird abgeraten, da eine reguläre Funktion scheint genauso gut.
Andere Tipps
Dies kann nicht auf Ihren Anwendungsfall gilt überhaupt. Aber ich habe erfolgreich verwenden dieses Muster in mehreren Fällen: (skizzenhaft und wahrscheinlich fehlerhaft, aber Sie erhalten den Punkt)
.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()