46 votes

Comment itérer des éléments Queue.Queue en Python ?

Est-ce que quelqu'un connaît un moyen pythonique d'itérer sur les éléments d'un Queue.Queue sans les supprimer de la file d'attente. J'ai un programme de type producteur/consommateur où les éléments à traiter sont passés à l'aide d'un Queue.Queue , et je veux pouvoir imprimer quels sont les éléments restants. Des idées?

52voto

Raymond Hettinger Points 231

Vous pouvez parcourir une copie du magasin de données sous-jacent :

 for elem in list(q.queue)

Même si cela contourne les verrous des objets Queue, la copie de liste est une opération atomique et cela devrait fonctionner correctement.

Si vous souhaitez conserver les verrous, pourquoi ne pas retirer toutes les tâches de la file d'attente, faire une copie de votre liste, puis les remettre en place.

 mycopy = []
while True:
     try:
         elem = q.get(block=False)
     except Empty:
         break
     else:
         mycopy.append(elem)
for elem in mycopy:
    q.put(elem)
for elem in mycopy:
    # do something with the elements

24voto

Omer Dagan Points 889

Lister les éléments de la file d'attente sans les consommer :

 >>> from Queue import Queue
>>> q = Queue()
>>> q.put(1)
>>> q.put(2)
>>> q.put(3)
>>> print list(q.queue)
[1, 2, 3]

Après opération, vous pouvez toujours les traiter :

 >>> q.get()
1
>>> print list(q.queue)
[2, 3]

9voto

Erwin Mayer Points 3427

Vous pouvez sous-classer queue.Queue pour y parvenir de manière thread-safe :

 import queue


class ImprovedQueue(queue.Queue):
    def to_list(self):
        """
        Returns a copy of all items in the queue without removing them.
        """

        with self.mutex:
            return list(self.queue)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X