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
3 Réponses :
>>> print(list(q.queue)) Does this work for you?
Savez-vous comment le faire pour le package multiprocesseur?
Non, mais je vais essayer.
et comment faire cela en Python 3?
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.
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.
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
Ça a l'air génial, merci pour le commentaire, je vais certainement essayer cela éventuellement.