Question

Il semble

import Queue

Queue.Queue().get(timeout=10)

est interruptible au clavier (ctrl-c) alors que

import Queue

Queue.Queue().get()

n'est pas. Je pourrais toujours créer une boucle;

import Queue
q = Queue()

while True:
    try:
        q.get(timeout=1000)
    except Queue.Empty:
        pass

mais cela semble être une chose étrange à faire.

Alors, y a-t-il moyen d'obtenir une file d'attente Queue.get ()? indéfiniment attendue mais interruptible au clavier?

Était-ce utile?

La solution

Les objets

de file d'attente ont ce comportement car ils se verrouillent à l'aide des objets Condition du module threading . Votre solution est donc vraiment la seule solution.

Toutefois, si vous souhaitez réellement utiliser une méthode Queue , vous pouvez aligner la classe Queue . Par exemple:

def interruptable_get(self):
    while True:
        try:
            return self.get(timeout=1000)
        except Queue.Empty:
            pass
Queue.interruptable_get = interruptable_get

Cela vous permettrait de dire

q.interruptable_get()

au lieu de

interruptable_get(q)

bien que la communauté Python décourage généralement l’attaque par les singes, car une fonction régulière semble tout aussi bonne.

Autres conseils

Cela peut ne pas s'appliquer à votre cas d'utilisation du tout. Mais j’ai utilisé ce modèle avec succès dans plusieurs cas: (peu précis et probablement bogué, mais vous comprenez le point).

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()
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top