2011-11-19 10 views
16

¿Alguien sabe una forma pitónica de iterar sobre los elementos de Queue.Queuesin eliminándolos de la cola. Tengo un programa de tipo productor/consumidor en el que los elementos que se procesarán se pasan utilizando un Queue.Queue, y deseo poder imprimir cuáles son los artículos restantes. ¿Algunas ideas?¿Cómo se iteran los elementos Queue.Queue en Python?

Respuesta

25

Puede recorrer más de una copia del almacén de datos subyacente:

for elem in list(q.queue) 

Apesar de esto no pasa por las cerraduras de objetos de cola, la copia de la lista es una operación atómica y debería funcionar bien.

Si desea mantener los bloqueos, ¿por qué no retira todas las tareas de la lista, copia la lista y luego vuelve a colocarlas?

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 
+1

'para elem in list (q.queue)' da como resultado 'TypeError: 'Queue' object no es iterable' en Python 3. ¿Quizás estoy haciendo algo mal? –

+1

@ macmadness86 Parece que tiene otra capa con "q" es un objeto de código que tiene un atributo "queue" que contiene un objeto Queue. Pruebe esto: '' para elem in list (q.queue.queue) ''. –

+0

Entendido. Cumplirá. Gracias por el consejo. (este mensaje está programado para su eliminación) –

2

Usted puede subclase queue.Queue para lograr esto de una manera segura para los subprocesos:

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

elementos de cola de venta sin consumirlos:

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

Después de la operación, se obtiene todavía procesarlos :

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