J'ai deux threads dans mon application. Un qui met des valeurs dans un file d'attente code>
, et une autre qui tire à partir de la queue code> Code> et les traite.
Je suis confronté à un dilemme lors de la fermeture de l'application. Le fil qui traite des éléments dans la file d'attente code> est bloqué sur: p> la seule chose qui terminera le thread est si un autre élément est ajouté à la SO ... Comment puis-je instruire la file d'attente File d'attente Code> - Et puisque le fil principal n'ajoute rien (car il s'agit d'une fermeture), l'application se verrouille. P>
. obtenez () code> en quelque sorte retour même s'il n'y a rien sur la queue code> code>? p> p>
3 Réponses :
La réponse qu'il s'avère est assez simple. Choisissez une valeur qui serait invalide pour le code qui traite la file d'attente code> ( Aucun code> est idéal pour cela) et appuyez sur cela dans la file d'attente code>. Ensuite, avez la queue code> Traitement du thread de traitement Quitter lorsqu'il obtient la valeur:
while True:
item = request_queue.get()
if item is None:
break
# process the Queue as per normal...
Puisque le fil de blocage n'est pas le fil principal, vous pouvez également définir .daemon = true code>.
Je pourrais ... mais cela entraînerait une fermeture impure du fil.
Ce problème peut toujours se produire si la queue.get () est appelée dans le thread principal - la réponse SetDaemon (TRUE) n'est donc pas une solution universelle.
Par exemple, ce script ne peut pas être arrêté avec Ctrl-C p> plutôt que de mettre un délai d'attente sur la file d'attente.get () et de faire face à des exceptions, une solution simple consiste à faire une boucle d'attente jusqu'à ce que quelque chose soit là. Ce script peut être tué avec CTRL-C P> #!/usr/bin/python
import Queue
theQ = Queue.Queue()
print "one thread getting from Queue"
while theQ.empty():
time.sleep(0.01) # or whatever value is appropriate for your event arrivals
print theQ.get()