¿Alguien sabe una forma pitónica de iterar sobre los elementos de Queue.Queue
sin 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?
16
A
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
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
- 1. Entendiendo os.fork y Queue.Queue
- 2. cómo actualizar los valores mientras se iteran los ítems del diccionario?
- 3. Python: ¿Por qué algunos de los métodos de Queue.queue "no son confiables"?
- 4. ¿Cómo se iteran los tipos enumerados inicializados con Delphi 6 y se evita el error "fuera de límites"?
- 5. Python "Todos los demás elementos" Idiom
- 6. "en" no se une a los elementos
- 7. Python - Cómo extraer los últimos x elementos de una lista
- 8. ¿Cómo se seleccionan los elementos en función de su estilo?
- 9. ¿Cómo se escriben los elementos del código en texto normal?
- 10. ¿Cómo organizar los elementos en QGridLayout como se muestra?
- 11. Múltiples hilos que iteran en el mismo mapa
- 12. Obtener los n elementos menores de una lista en Python
- 13. ¿Cómo se organizan los módulos de Python?
- 14. ¿Cómo se limpian los zócalos de Python?
- 15. Clasifique los elementos en una matriz usando Python/NumPy
- 16. Acceso a los elementos en listas dentro del diccionario python
- 17. Todos menos los últimos N elementos del iterador en Python
- 18. Cómo eliminar elementos de XML usando Python
- 19. ¿Cómo se formatean los booleanos en Cadenas en Python?
- 20. QuadTrees: cómo actualizar cuándo se mueven los elementos internos
- 21. ¿Cómo se crean dinámicamente los elementos de la vista Backbone?
- 22. XPath: ¿cómo se seleccionan los elementos secundarios de un nodo?
- 23. ¿Cómo se muestra el divisor entre los elementos de giro?
- 24. Editar elementos en una lista en python
- 25. ¿Cómo se agregan diferentes opacidades a los elementos anidados?
- 26. Reemplazar "elementos restantes truncados" en Python
- 27. cómo acceder a los elementos en una matriz 2D?
- 28. No se muestran los elementos de AlertDialog
- 29. Cómo se desactivan los elementos <script> usando JavaScript
- 30. Cómo desencadenar eventos en todos los elementos
'para elem in list (q.queue)' da como resultado 'TypeError: 'Queue' object no es iterable' en Python 3. ¿Quizás estoy haciendo algo mal? –
@ 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) ''. –
Entendido. Cumplirá. Gracias por el consejo. (este mensaje está programado para su eliminación) –