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
# 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
# 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
# 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 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
| Klasse | Beschreibung | Geeignete Szenarien |
|---|---|---|
queue.Queue | FIFO-Warteschlange (First-In, First-Out) | Allgemeine Aufgabenwarteschlange |
queue.LifoQueue | LIFO-Warteschlange (Last-In, First-Out; ähnlich einem Stack) | Szenarien, die Last-In, First-Out erfordern |
queue.PriorityQueue | Prioritätswarteschlange (Min-Heap-Implementierung) | Aufgaben nach Priorität verarbeiten |
queue.SimpleQueue | Einfachere FIFO-Warteschlange (Python 3.7+) | Szenarien, die keine erweiterten Funktionen erfordern |
Gemeinsame Methoden (von allen Queue-Klassen unterstützt)
| Methode | Beschreibung | Beispiel | Rückgabewert |
|---|---|---|---|
put(item) | Ein Element einfügen | q.put("task1") | Keine |
get() | Ein Element abrufen und entfernen | item = q.get() | Queue-Element |
empty() | Prüfen, ob die Warteschlange leer ist | if q.empty(): | True/False |
full() | Prüfen, ob die Queue voll ist | if q.full(): | True/False |
qsize() | Die aktuelle Größe der Queue zurückgeben | size = q.qsize() | Integer |
task_done() | Aufgabenabschluss markieren (verwendet zumjoin()) | q.task_done() | Keine |
join() | Blockieren, bis alle Aufgaben abgeschlossen sind | q.join() | Keine |
Blockierungs-Steuerparameter
| Parameter | Beschreibung | Standardwert | Beispiel |
|---|---|---|---|
block | Ob blockiert werden soll, wenn die Queue leer/voll ist | True | q.get(block=False) |
timeout | Blockierungs-Timeout (Sekunden) | None | q.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.put((1, "low"))
pq.put((0, "high"))
print(pq.get()[1]) # Ausgabe: "high"
Beispiel
Erzeuger-Verbraucher-Modell:
Beispiel
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.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
item = q.get_nowait() # Entspricht q.get(block=False)
except queue.Empty:
print("Warteschlange ist leer")