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 ()?

War es hilfreich?

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()
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top