Módulo queue de Python
En Python,queueel módulo proporciona una implementación de cola segura para hilos, utilizada para transferir datos de forma segura en la programación multihilo.
Una cola es una estructura de datos de tipo primero en entrar, primero en salir (FIFO),queueEl módulo proporciona varios tipos de colas, incluyendoQueue、LifoQueueyPriorityQueue, para satisfacer diferentes necesidades.
Tipos de colas
1. Queue
QueueSíqueueEl tipo de cola más utilizado en el módulo, que implementa la cola estándar FIFO (primero en entrar, primero en salir). A continuación se muestraQueueUso básico:
Ejemplo
# Crear una cola
q = queue.Queue()
# Agregar elementos a la cola
q.put(1)
q.put(2)
q.put(3)
# Obtener elementos de la cola
print(q.get()) # Salida: 1
print(q.get()) # Salida: 2
print(q.get()) # Salida: 3
2. LifoQueue
LifoQueueEs una cola de tipo último en entrar, primero en salir (LIFO), similar a una pila. A continuación se muestraLifoQueueUso básico:
Ejemplo
# Crear una cola LIFO
q = queue.LifoQueue()
# Agregar elementos a la cola
q.put(1)
q.put(2)
q.put(3)
# Obtener elementos de la cola
print(q.get()) # Salida: 3
print(q.get()) # Salida: 2
print(q.get()) # Salida: 1
3. PriorityQueue
PriorityQueueEs una cola de prioridad en la que los elementos se extraen en orden de prioridad. A continuación se muestraPriorityQueueUso básico:
Ejemplo
# Crear una cola de prioridad
q = queue.PriorityQueue()
# Agregar elementos a la cola; el elemento es una tupla (prioridad, dato)
q.put((3, 'Low priority'))
q.put((1, 'High priority'))
q.put((2, 'Medium priority'))
# Obtener elementos de la cola
print(q.get()) # Salida: (1, 'High priority')
print(q.get()) # Salida: (2, 'Medium priority')
print(q.get()) # Salida: (3, 'Low priority')
Métodos comunes
1. put(item, block=True, timeout=None)
va aitemInserta en la cola. SiblockParaTruey la cola está llena, esperatimeoutsegundos, hasta que haya espacio libre en la cola. SitimeoutParaNone, espera indefinidamente.
2. get(block=True, timeout=None)
Obtiene y elimina un elemento de la cola. SiblockParaTruey la cola está vacía, esperatimeoutsegundos, hasta que haya un elemento en la cola. SitimeoutParaNone, espera indefinidamente.
3. qsize()
Devuelve el número de elementos en la cola.
4. empty()
Si la cola está vacía, devuelveTrue, de lo contrario devuelveFalse。
5. full()
Si la cola está llena, devuelveTrue, de lo contrario devuelveFalse。
Seguridad de hilos
queueTodos los tipos de cola del módulo son seguros para hilos, lo que significa que varios hilos pueden operar de forma segura sobre la misma cola al mismo tiempo sin necesidad de mecanismos de sincronización adicionales. Esto hace quequeueel módulo sea una opción ideal para transferir datos en programación multihilo.
Ejemplo: cola multihilo
A continuación se muestra un ejemplo que utilizaQueuepara transferir datos entre varios hilos:
Ejemplo
import threading
import time
# Crear una cola
q = queue.Queue()
# Hilo productor
def producer():
for i in range(5):
print(f'Producir {i}')
q.put(i)
time.sleep(1)
# Hilo consumidor
def consumer():
while True:
item = q.get()
if item is None:
break
print(f'Consumir {item}')
q.task_done()
# Iniciar el hilo productor
producer_thread = threading.Thread(target=producer)
producer_thread.start()
# Iniciar el hilo consumidor
consumer_thread = threading.Thread(target=consumer)
consumer_thread.start()
# Esperar a que el hilo productor termine
producer_thread.join()
# Esperar a que se completen todas las tareas de la cola
q.join()
# Enviar señal de finalización
q.put(None)
consumer_thread.join()
Propiedades y métodos comunes
A continuación se muestra una tabla explicativa de las clases, métodos y propiedades comunes del módulo queue de Python (cola segura para hilos), incluyendo descripciones de funciones y ejemplos:
Clases principales del módulo queue
| Clase | Descripción | Escenario de aplicación |
|---|---|---|
queue.Queue | Cola FIFO (primero en entrar, primero en salir) | Cola de tareas general |
queue.LifoQueue | Cola LIFO (último en entrar, primero en salir) (similar a una pila) | Escenarios que requieren LIFO |
queue.PriorityQueue | Cola de prioridad (implementación con montículo mínimo) | Procesar tareas por prioridad |
queue.SimpleQueue | Cola FIFO más sencilla (Python 3.7+) | Escenarios que no requieren funciones avanzadas |
Métodos comunes (compatibles con todas las clases de cola)
| Método | Descripción | Ejemplo | Valor de retorno |
|---|---|---|---|
put(item) | Inserta un elemento | q.put("task1") | None |
get() | Extrae y elimina un elemento | item = q.get() | Elemento de la cola |
empty() | Comprueba si la cola está vacía | if q.empty(): | True/False |
full() | Comprueba si la cola está llena | if q.full(): | True/False |
qsize() | Devuelve el tamaño actual de la cola | size = q.qsize() | Entero |
task_done() | Marca la tarea como completada (usado parajoin()) | q.task_done() | None |
join() | Bloquea hasta que se completen todas las tareas | q.join() | None |
Parámetros de control de bloqueo
| Parámetro | Descripción | Valor predeterminado | Ejemplo |
|---|---|---|---|
block | Indica si se bloquea cuando la cola está vacía/llena | True | q.get(block=False) |
timeout | Tiempo de espera de bloqueo (segundos) | None | q.put(x, timeout=5) |
Uso específico de PriorityQueue
Formato del elemento:(priority, data); cuanto menor sea la prioridad, antes saldrá de la cola
Ejemplo
pq.put((1, "low"))
pq.put((0, "high"))
print(pq.get()[1]) # Salida: "high"
Ejemplo
Modelo productor-consumidor:
Ejemplo
q = queue.Queue(maxsize=3) # Cola con capacidad de 3
def producer():
for i in range(5):
q.put(f"Task-{i}")
print(f"Produced: Task-{i}")
def consumer():
while True:
item = q.get()
print(f"Consumed: {item}")
q.task_done()
threading.Thread(target=producer, daemon=True).start()
threading.Thread(target=consumer, daemon=True).start()
q.join() # Esperar a que se completen todas las tareas
Procesamiento de tareas por prioridad:
Ejemplo
pq.put((3, "Scan"))
pq.put((1, "Emergency"))
pq.put((2, "Log"))
while not pq.empty():
print(pq.get()[1]) # Orden de salida: Emergency → Log → Scan
Obtención no bloqueante (para evitar interbloqueos):
Ejemplo
item = q.get_nowait() # Equivalente a q.get(block=False)
except queue.Empty:
print("La cola está vacía")