5
votes

Impression du contenu d'une file d'attente en Python

Si j'utilise le module python queue.Queue, je veux pouvoir imprimer le contenu en utilisant une méthode qui ne fait pas apparaître la file d'attente d'origine ou créer un nouvel objet de file d'attente.

J'ai essayé de faire un get et ensuite remettre le contenu mais c'est trop cher.

# Ideally it would look like the following
from queue import Queue
q = Queue()
q.print()
q.put(1)
q.print()

>> [] # Or something like this
>> [1] # Or something like this


0 commentaires

3 Réponses :


11
votes
>>> print(list(q.queue))
Does this work for you?

3 commentaires

Savez-vous comment le faire pour le package multiprocesseur?


Non, mais je vais essayer.


et comment faire cela en Python 3?



2
votes

En supposant que vous utilisez python 2. Vous pouvez utiliser quelque chose comme ceci:

for q_item in q.queue:
    print q_item

Vous pouvez également faire une boucle dessus:

from queue import Queue
q = Queue.Queue()
q.put(1)
q.put(2)
q.put(3)
print q.queue

Mais à moins que vous ayez affaire à des threads, je le ferais utiliser une liste normale comme implémentation de file d'attente.


1 commentaires

Merci pour le commentaire, dans ce scénario particulier, j'utilise des threads. L'itération à travers les listes semble intéressante et utile peut-être pour imprimer un élément correspondant spécifique.



1
votes

Désolé, je suis un peu en retard pour répondre à cette question, mais je passe par ce commentaire , j'ai étendu la file d'attente dans le package multitraitement selon vos besoins. J'espère que cela aidera quelqu'un à l'avenir.

def sample_func(queue_ref):
    for i in range(10):
        queue_ref.put(i)


IQ = IterQueue()

p = mp.Process(target=sample_func, args=(IQ,))
p.start()
p.join()

print(list(IQ))  # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

Voici un exemple d'utilisation de ce IterQueue J'ai écrit:

import multiprocessing as mp
from multiprocessing import queues


class IterQueue(queues.Queue):

    def __init__(self, *args, **kwargs):
        ctx = mp.get_context()
        kwargs['ctx'] = ctx
        super().__init__(*args, **kwargs)

    # <----  Iter Protocol  ------>
    def __iter__(self):
        return self

    def __next__(self):
        try:
            if not self.empty():
                return self.get()  # block=True | default
            else:
                raise StopIteration
        except ValueError:  # the Queue is closed
            raise StopIteration


1 commentaires

Ça a l'air génial, merci pour le commentaire, je vais certainement essayer cela éventuellement.