Python-queue-Modul

In Python,queueDas Modul bietet eine threadsichere Warteschlangenimplementierung für die sichere Übergabe von Daten in der Multithread-Programmierung.

Eine Warteschlange ist eine First-In-First-Out-Datenstruktur (FIFO),queueDas Modul bietet mehrere Warteschlangentypen, darunterQueue、LifoQueueundPriorityQueue, um unterschiedliche Anforderungen zu erfüllen.


Warteschlangen-Typen

1. Queue

QueueJaqueueDer am häufigsten verwendete Warteschlangentyp im Modul, der eine standardmäßige FIFO-Warteschlange (First-In, First-Out) implementiert. Das Folgende istQueuedie grundlegende Verwendung:

Beispiel

import queue

# Eine Warteschlange erstellen
q = queue.Queue()

# Elemente zur Warteschlange hinzufügen
q.put(1)
q.put(2)
q.put(3)

# Elemente aus der Warteschlange abrufen
print(q.get())  # Ausgabe: 1
print(q.get())  # Ausgabe: 2
print(q.get())  # Ausgabe: 3

2. LifoQueue

LifoQueueist eine LIFO-Warteschlange (Last-In-First-Out), ähnlich einem Stack. Das Folgende istLifoQueuedie grundlegende Verwendung:

Beispiel

import queue

# Eine LIFO-Warteschlange erstellen
q = queue.LifoQueue()

# Elemente zur Warteschlange hinzufügen
q.put(1)
q.put(2)
q.put(3)

# Elemente aus der Warteschlange abrufen
print(q.get())  # Ausgabe: 3
print(q.get())  # Ausgabe: 2
print(q.get())  # Ausgabe: 1

3. PriorityQueue

PriorityQueueist eine Prioritätswarteschlange, bei der Elemente in Prioritätsreihenfolge entnommen werden. Das Folgende istPriorityQueuedie grundlegende Verwendung:

Beispiel

import queue

# Eine Prioritätswarteschlange erstellen
q = queue.PriorityQueue()

# Elemente zur Warteschlange hinzufügen, Elemente sind Tupel (Priorität, Daten)
q.put((3, 'Low priority'))
q.put((1, 'High priority'))
q.put((2, 'Medium priority'))

# Elemente aus der Warteschlange abrufen
print(q.get())  # Ausgabe: (1, 'High priority')
print(q.get())  # Ausgabe: (2, 'Medium priority')
print(q.get())  # Ausgabe: (3, 'Low priority')

Häufige Methoden

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

wirditemIn die Warteschlange einfügen. WennblockistTrueund die Warteschlange voll ist, wartentimeoutSekunden, bis es freien Platz in der Warteschlange gibt. WenntimeoutistNone, dann unbegrenzt warten.

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

Ein Element aus der Warteschlange abrufen und entfernen. WennblockistTrueund die Warteschlange leer ist, wartentimeoutSekunden, bis sich ein Element in der Warteschlange befindet. WenntimeoutistNone, dann unbegrenzt warten.

3. qsize()

Gibt die Anzahl der Elemente in der Warteschlange zurück.

4. empty()

Wenn die Warteschlange leer ist, zurückgebenTrue, andernfalls zurückgebenFalse。

5. full()

Wenn die Queue voll ist, returnTrue, andernfalls zurückgebenFalse。


Threadsicherheit

queueAlle Queue-Typen des Moduls sind threadsicher, was bedeutet, dass mehrere Threads gleichzeitig sicher auf derselben Queue arbeiten können, ohne zusätzliche Synchronisationsmechanismen. Dies machtqueuedas Modul zu einer idealen Wahl für die Übergabe von Daten in der Multithread-Programmierung.


Beispiel: Multithread-Queue

Das Folgende ist ein Beispiel für die Verwendung vonQueueum Daten zwischen mehreren Threads zu übergeben:

Beispiel

import queue
import threading
import time

# Eine Warteschlange erstellen
q = queue.Queue()

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

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

# Starte den Producer-Thread
producer_thread = threading.Thread(target=producer)
producer_thread.start()

# Starte den Consumer-Thread
consumer_thread = threading.Thread(target=consumer)
consumer_thread.start()

# Warte, bis der Producer-Thread fertig ist
producer_thread.join()

# Warte, bis alle Aufgaben in der Warteschlange abgeschlossen sind
q.join()

# Sende ein Endsignal
q.put(None)
consumer_thread.join()

Häufige Attribute und Methoden

Das Folgende ist eine tabellarische Beschreibung der gängigen Klassen, Methoden und Attribute des Python-Moduls queue (threadsichere Warteschlange), einschließlich Funktionsbeschreibungen und Beispielen:

Kernklassen des queue-Moduls

KlasseBeschreibungGeeignete Szenarien
queue.QueueFIFO-Warteschlange (First-In, First-Out)Allgemeine Aufgabenwarteschlange
queue.LifoQueueLIFO-Warteschlange (Last-In, First-Out; ähnlich einem Stack)Szenarien, die Last-In, First-Out erfordern
queue.PriorityQueuePrioritätswarteschlange (Min-Heap-Implementierung)Aufgaben nach Priorität verarbeiten
queue.SimpleQueueEinfachere FIFO-Warteschlange (Python 3.7+)Szenarien, die keine erweiterten Funktionen erfordern

Gemeinsame Methoden (von allen Queue-Klassen unterstützt)

MethodeBeschreibungBeispielRückgabewert
put(item)Ein Element einfügenq.put("task1")Keine
get()Ein Element abrufen und entfernenitem = q.get()Queue-Element
empty()Prüfen, ob die Warteschlange leer istif q.empty():True/False
full()Prüfen, ob die Queue voll istif q.full():True/False
qsize()Die aktuelle Größe der Queue zurückgebensize = q.qsize()Integer
task_done()Aufgabenabschluss markieren (verwendet zumjoin())q.task_done()Keine
join()Blockieren, bis alle Aufgaben abgeschlossen sindq.join()Keine

Blockierungs-Steuerparameter

ParameterBeschreibungStandardwertBeispiel
blockOb blockiert werden soll, wenn die Queue leer/voll istTrueq.get(block=False)
timeoutBlockierungs-Timeout (Sekunden)Noneq.put(x, timeout=5)

PriorityQueue-spezifische Verwendung

Elementformat:(priority, data), je kleiner die Priorität, desto früher wird es aus der Warteschlange entnommen

Beispiel

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

Beispiel

Erzeuger-Verbraucher-Modell:

Beispiel

import queue, threading

q = queue.Queue(maxsize=3)  # Warteschlange mit Kapazität 3

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

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

threading.Thread(target=producer, daemon=True).start()
threading.Thread(target=consumer, daemon=True).start()
q.join()  # Warten, bis alle Aufgaben abgeschlossen sind

Priorisierte Aufgabenverarbeitung:

Beispiel

pq = queue.PriorityQueue()
pq.put((3, "Scan"))
pq.put((1, "Emergency"))
pq.put((2, "Log"))

while not pq.empty():
    print(pq.get()[1])  # Ausgabereihenfolge: Emergency → Log → Scan

Nicht blockierendes get (um Deadlock zu vermeiden):

Beispiel

try:
    item = q.get_nowait()  # Entspricht q.get(block=False)
except queue.Empty:
    print("Warteschlange ist leer")
Andere Erweiterungen