Vérification pour vider la File d'attente en python multitraitement
J'ai un programme à l'aide de python de paquets de multitraitement et la File d'attente. Un de mes fonctions ont cette structure:
from multiprocessing import Process, Queue
def foo(queue):
while True:
try:
a = queue.get(block = False)
doAndPrintStuff(a)
except:
print "the end"
break
if __name__ == "__main__"
nthreads = 4
queue = Queue.Queue()
# put stuff in the queue here
for stuff in moreStuff:
queue.put(stuff)
procs = [Process(target = foo, args = (queue,)) for i in xrange(nthreads)]
for p in procs:
p.start()
for p in procs:
p.join()
l'idée est que lorsque je tente d'extraire à partir de la file d'attente et il est vide, il faudra lever une exception et terminer la boucle. J'ai donc deux questions:
1) est-ce un coffre-fort idiome? Sont t-il de meilleures façons de le faire?
2) j'ai essayé de trouver quelle est l'exacte exception qui est levée lorsque j'essaie de .get()
du vide d'une file d'attente. Actuellement mon programme est d'attraper toutes les exceptions, qui suce quand l'erreur est ailleurs, et je ne reçois que "la fin" du message.
J'ai essayé:
import Queue
queue = Queue.Queue()
[queue.put(x) for x in xrange(10)]
try:
print queue.get(block = False)
except Queue.Empty:
print "end"
break
mais j'ai obtenu l'erreur comme si je n'avais pas pris l'exception. Quel est l'exception correcte pour attraper?
OriginalL'auteur Rafael S. Calsaverini | 2011-08-18
Vous devez vous connecter pour publier un commentaire.
L'exception doit être
Queue.Empty
. Mais êtes-vous sûr que vous avez le même erreur? Dans ton deuxième exemple, vous avez également passé de la file d'attente demultiprocessing.Queue
àQueue.Queue
, qui, je pense, peut-être le problème.Il peut sembler étrange, mais vous devez utiliser le
multiprocessing.Queue
classe, mais l'utilisation de laQueue.Empty
exception (que vous devez importer vous-même à partir de laQueue
module)OriginalL'auteur Steven
Il semble que la File d'attente est vide jusqu'à ce que le mettre de tampons sont vidés, ce qui peut prendre un certain temps.
La solution à notre problème est pour utiliser les sentinelles, ou peut-être le haut- task_done() appel:
OriginalL'auteur Cees Timmerman
Essayez de lire le la file d'attente bibliothèque de docs. N'êtes-vous pas à la recherche pour La file d'attente.empty()?
OriginalL'auteur Ross Patterson