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

import queue

# 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

import queue

# 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

import queue

# 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 queue
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

ClaseDescripciónEscenario de aplicación
queue.QueueCola FIFO (primero en entrar, primero en salir)Cola de tareas general
queue.LifoQueueCola LIFO (último en entrar, primero en salir) (similar a una pila)Escenarios que requieren LIFO
queue.PriorityQueueCola de prioridad (implementación con montículo mínimo)Procesar tareas por prioridad
queue.SimpleQueueCola FIFO más sencilla (Python 3.7+)Escenarios que no requieren funciones avanzadas

Métodos comunes (compatibles con todas las clases de cola)

MétodoDescripciónEjemploValor de retorno
put(item)Inserta un elementoq.put("task1")None
get()Extrae y elimina un elementoitem = q.get()Elemento de la cola
empty()Comprueba si la cola está vacíaif q.empty():True/False
full()Comprueba si la cola está llenaif q.full():True/False
qsize()Devuelve el tamaño actual de la colasize = q.qsize()Entero
task_done()Marca la tarea como completada (usado parajoin())q.task_done()None
join()Bloquea hasta que se completen todas las tareasq.join()None

Parámetros de control de bloqueo

ParámetroDescripciónValor predeterminadoEjemplo
blockIndica si se bloquea cuando la cola está vacía/llenaTrueq.get(block=False)
timeoutTiempo de espera de bloqueo (segundos)Noneq.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 = queue.PriorityQueue()
pq.put((1, "low"))
pq.put((0, "high"))
print(pq.get()[1])  # Salida: "high"

Ejemplo

Modelo productor-consumidor:

Ejemplo

import queue, threading

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 = queue.PriorityQueue()
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

try:
    item = q.get_nowait()  # Equivalente a q.get(block=False)
except queue.Empty:
    print("La cola está vacía")
Otras extensiones