File d'attente de blocage interruptible au clavier en Python
-
03-07-2019 - |
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?
La solution
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()