Module queue de Python

En Python,queuele module fournit une implémentation de file d'attente thread-safe pour transmettre des données en toute sécurité dans la programmation multithread.

Une file d'attente est une structure de données de type premier entré, premier sorti (FIFO),queuele module fournit plusieurs types de files d'attente, notammentQueue、LifoQueueetPriorityQueue, pour répondre à différents besoins.


Types de files d'attente

1. Queue

QueueOuiqueueLe type de file d'attente le plus couramment utilisé dans le module, qui implémente une file d'attente FIFO (premier entré, premier sorti) standard. Ce qui suit estQueuel'utilisation de base :

Exemple

import queue

# Créer une file d'attente
q = queue.Queue()

# Ajouter des éléments à la file d'attente
q.put(1)
q.put(2)
q.put(3)

# Récupérer des éléments de la file d'attente
print(q.get())  # Sortie : 1
print(q.get())  # Sortie : 2
print(q.get())  # Sortie : 3

2. LifoQueue

LifoQueueest une file LIFO (dernier entré, premier sorti), semblable à une pile. VoiciLifoQueuel'utilisation de base :

Exemple

import queue

# Créer une file LIFO
q = queue.LifoQueue()

# Ajouter des éléments à la file d'attente
q.put(1)
q.put(2)
q.put(3)

# Récupérer des éléments de la file d'attente
print(q.get())  # Sortie : 3
print(q.get())  # Sortie : 2
print(q.get())  # Sortie : 1

3. PriorityQueue

PriorityQueueest une file de priorité où les éléments sont retirés par ordre de priorité. VoiciPriorityQueuel'utilisation de base :

Exemple

import queue

# Créer une file de priorité
q = queue.PriorityQueue()

# Ajouter des éléments à la file, les éléments sont des tuples (priorité, données)
q.put((3, 'Priorité basse'))
q.put((1, 'Priorité élevée'))
q.put((2, 'Priorité moyenne'))

# Récupérer des éléments de la file d'attente
print(q.get())  # Sortie : (1, 'High priority')
print(q.get())  # Sortie : (2, 'Medium priority')
print(q.get())  # Sortie : (3, 'Low priority')

Méthodes courantes

1. put(item, block=True, timeout=None)

vaitemPlacez dans la file. SiblockestTrueet que la file est pleine, patienteztimeoutsecondes jusqu'à ce qu'il y ait de la place libre dans la file. SitimeoutestNone, alors patientez indéfiniment.

2. get(block=True, timeout=None)

Récupérez et retirez un élément de la file. SiblockestTrueet que la file est vide, patienteztimeoutsecondes jusqu'à ce qu'il y ait un élément dans la file. SitimeoutestNone, alors patientez indéfiniment.

3. qsize()

Renvoyez le nombre d'éléments dans la file.

4. empty()

Si la file est vide, renvoyezTrue, sinon renvoyerFalse。

5. full()

Si la file d'attente est pleine, retournerTrue, sinon renvoyerFalse。


Sécurité des threads

queueTous les types de file d'attente du module sont thread-safe, ce qui signifie que plusieurs threads peuvent opérer en toute sécurité sur la même file d'attente en même temps sans mécanismes de synchronisation supplémentaires. Cela faitqueuedu module un choix idéal pour transmettre des données en programmation multithread.


Exemple : file d'attente multithread

Ce qui suit est un exemple d'utilisation deQueuepour transmettre des données entre plusieurs threads :

Exemple

import queue
import threading
import time

# Créer une file d'attente
q = queue.Queue()

# Thread producteur
def producer():
    for i in range(5):
        print(f'Produce {i}')
        q.put(i)
        time.sleep(1)

# Thread consommateur
def consumer():
    while True:
        item = q.get()
        if item is None:
            break
        print(f'Consommer {item}')
        q.task_done()

# Démarrer le thread producteur
producer_thread = threading.Thread(target=producer)
producer_thread.start()

# Démarrer le thread consommateur
consumer_thread = threading.Thread(target=consumer)
consumer_thread.start()

# Attendre la fin du thread producteur
producer_thread.join()

# Attendre que toutes les tâches dans la file d'attente soient terminées
q.join()

# Envoyer un signal de fin
q.put(None)
consumer_thread.join()

Attributs et méthodes courants

Ce qui suit est une description sous forme de tableau des classes, méthodes et attributs courants du module queue de Python (file d'attente thread-safe), incluant les descriptions des fonctions et des exemples :

Classes principales du module queue

ClasseDescriptionScénarios applicables
queue.QueueFile d'attente FIFO (premier entré, premier sorti)File d'attente de tâches générale
queue.LifoQueueFile d'attente LIFO (dernier entré, premier sorti) (similaire à une pile)Scénarios nécessitant un dernier entré, premier sorti
queue.PriorityQueueFile d'attente prioritaire (implémentation par tas min)Traiter les tâches par priorité
queue.SimpleQueueFile d'attente FIFO plus simple (Python 3.7+)Scénarios ne nécessitant pas de fonctionnalités avancées

Méthodes communes (prises en charge par toutes les classes de file d'attente)

MéthodeDescriptionExempleValeur de retour
put(item)Ajouter un élémentq.put("task1")Aucune
get()Obtenir et supprimer un élémentitem = q.get()Élément de la file d'attente
empty()Vérifier si la file est videif q.empty():True/False
full()Vérifier si la file d'attente est pleineif q.full():True/False
qsize()Retourner la taille actuelle de la file d'attentesize = q.qsize()Integer
task_done()Marquer l'achèvement d'une tâche (utilisé pourjoin())q.task_done()Aucune
join()bloquer jusqu'à ce que toutes les tâches soient terminéesq.join()Aucune

Paramètres de contrôle du blocage

ParamètreDescriptionValeur par défautExemple
blockIndique s'il faut bloquer lorsque la file d'attente est vide/pleineTrueq.get(block=False)
timeoutDélai d'attente de blocage (secondes)Noneq.put(x, timeout=5)

Utilisation spécifique de PriorityQueue

Format de l'élément :(priority, data), plus la priorité est faible, plus tôt il est retiré de la file

Exemple

pq = queue.PriorityQueue()
pq.put((1, "low"))
pq.put((0, "high"))
print(pq.get()[1])  # Sortie : "high"

Exemple

Modèle producteur-consommateur :

Exemple

import queue, threading

q = queue.Queue(maxsize=3)  # File d'attente avec capacité 3

def producer():
    for i in range(5):
        q.put(f"Task-{i}")
        print(f"Produit : Task-{i}")

def consumer():
    while True:
        item = q.get()
        print(f"Consommé : {item}")
        q.task_done()

threading.Thread(target=producer, daemon=True).start()
threading.Thread(target=consumer, daemon=True).start()
q.join()  # Attendre que toutes les tâches soient terminées

Traitement des tâches par priorité :

Exemple

pq = queue.PriorityQueue()
pq.put((3, "Analyse"))
pq.put((1, "Urgence"))
pq.put((2, "Journal"))

while not pq.empty():
    print(pq.get()[1])  # Ordre de sortie : Urgence → Journal → Analyse

get non bloquant (pour éviter l'interblocage) :

Exemple

try:
    item = q.get_nowait()  # Équivalent à q.get(block=False)
except queue.Empty:
    print("La file est vide")
Autres extensions