9
votes

Comment faire venir ce fil sur une file d'attente?

J'ai deux threads dans mon application. Un qui met des valeurs dans un file d'attente , et une autre qui tire à partir de la queue 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 est bloqué sur: xxx

la seule chose qui terminera le thread est si un autre élément est ajouté à la File d'attente - Et puisque le fil principal n'ajoute rien (car il s'agit d'une fermeture), l'application se verrouille.

SO ... Comment puis-je instruire la file d'attente . obtenez () en quelque sorte retour même s'il n'y a rien sur la queue ?


0 commentaires

3 Réponses :


13
votes

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...


0 commentaires

1
votes

Puisque le fil de blocage n'est pas le fil principal, vous pouvez également définir .daemon = true . xxx


1 commentaires

Je pourrais ... mais cela entraînerait une fermeture impure du fil.



0
votes

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> xxx pré>

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


0 commentaires