poll implementacion full cola python queue producer-consumer

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)