implementacion - queue queue python 3
¿Cómo iterar los elementos Queue.Queue en Python? (3)
Listado de elementos de la cola 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, todavía puede procesarlas:
>>> q.get()
1
>>> print list(q.queue)
[2, 3]
¿Alguien sabe una forma pitónica de iterar sobre los elementos de un Queue.Queue
sin eliminarlos de la Cola? Tengo un programa de tipo productor / consumidor donde los elementos que se van a procesar se pasan utilizando una Queue.Queue
, y quiero poder imprimir cuáles son los elementos restantes. ¿Algunas ideas?
Puede hacer un bucle sobre una copia del almacén de datos subyacente:
for elem in list(q.queue)
Aunque esto evita los bloqueos para los objetos de la 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 sacar todas las tareas de la cola, hacer una copia de la lista y luego volver 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
Puede subclase queue.Queue
para lograr esto de una manera segura para 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)