Heim > Backend-Entwicklung > Python-Tutorial > Detaillierte Erläuterung des Python-Warteschlangenmoduls

Detaillierte Erläuterung des Python-Warteschlangenmoduls

巴扎黑
Freigeben: 2017-07-19 13:16:57
Original
2338 Leute haben es durchsucht

Queue

Queue ist eine Thread-sichere Warteschlangenimplementierung (FIFO) in der Python-Standardbibliothek. Sie bietet eine First-In-First-Out-Datenstruktur, die für die Multithread-Programmierung geeignet ist Warteschlange, die in Produzenten verwendet wird Informationsübertragung zwischen Verbraucherthreads

Grundlegende FIFO-Warteschlange

Klasse Queue.Queue(maxsize=0)

FIFO ist Zuerst rein, zuerst raus, zuerst rein, zuerst raus. Queue stellt einen einfachen FIFO-Container bereit, der sehr einfach zu verwenden ist. maxsize ist eine Ganzzahl, die die Obergrenze der Anzahl der Daten angibt, die in der Warteschlange gespeichert werden können. Sobald das Limit erreicht ist, führen Einfügungen zu einer Blockierung, bis die Daten in der Warteschlange verbraucht sind. Wenn maxsize kleiner oder gleich 0 ist, gibt es keine Begrenzung für die Warteschlangengröße.

Zum Beispiel:

1 import Queue2 3 q = Queue.Queue()4 5 for i in range(5):6     q.put(i)7 8 while not q.empty():9     print q.get()
Nach dem Login kopieren

Ausgabe:

01
2
3
4
Nach dem Login kopieren

LIFO-Warteschlange

Klasse Queue.LifoQueue(maxsize=0)

LIFO ist Last in First Out, last in first out. Ähnlich wie der Stack ist die Verwendung von maxsize die gleiche wie oben

Ein weiteres Beispiel:

1 import Queue2 3 q = Queue.LifoQueue()4 5 for i in range(5):6     q.put(i)7 8 while not q.empty():9     print q.get()
Nach dem Login kopieren

Ausgabe:

4
3
2
10
Nach dem Login kopieren

Sie können sehen, dass Sie einfach Queue.Quenu类 durch Queue.LifiQueue类

Prioritätswarteschlange

Klasse Queue.PriorityQueue(maxsize=0)

Erstellt eine Prioritätswarteschlange. Die Verwendung von maxsize ist die gleiche wie oben.

import Queueimport threadingclass Job(object):def __init__(self, priority, description):
        self.priority = priority
        self.description = descriptionprint 'Job:',descriptionreturndef __cmp__(self, other):return cmp(self.priority, other.priority)

q = Queue.PriorityQueue()

q.put(Job(3, 'level 3 job'))
q.put(Job(10, 'level 10 job'))
q.put(Job(1, 'level 1 job'))def process_job(q):while True:
        next_job = q.get()print 'for:', next_job.description
        q.task_done()

workers = [threading.Thread(target=process_job, args=(q,)),
        threading.Thread(target=process_job, args=(q,))
        ]for w in workers:
    w.setDaemon(True)
    w.start()

q.join()
结果
Job: level 3 job
Job: level 10 job
Job: level 1 jobfor: level 1 jobfor: level 3 jobfor: job: level 10 job
Nach dem Login kopieren

Einige gängige Methoden

task_done()

bedeutet, sich vorher in die Warteschlange einzufügen Eine der Aufgaben wurde abgeschlossen. Wird vom Consumer-Thread der Warteschlange aufgerufen. Jeder get()-Aufruf ruft eine Aufgabe ab und der folgende task_done()-Aufruf teilt der Warteschlange mit, dass die Aufgabe verarbeitet wurde.

Wenn der aktuelle join() blockiert, wird die Ausführung fortgesetzt, wenn alle Aufgaben in der Warteschlange verarbeitet sind (d. h. jede von put() in die Warteschlange gestellte Aufgabe verfügt über einen entsprechenden task_done()-Aufruf).

join()

Blockiert den aufrufenden Thread, bis alle Aufgaben in der Warteschlange verarbeitet sind.

Solange Daten zur Warteschlange hinzugefügt werden, erhöht sich die Anzahl der nicht erledigten Aufgaben. Wenn der Verbraucherthread task_done() aufruft (was bedeutet, dass ein Verbraucher die Aufgabe erhält und die Aufgabe abschließt), wird die Anzahl der nicht abgeschlossenen Aufgaben reduziert. Wenn die Anzahl der nicht erledigten Aufgaben auf 0 sinkt, wird die Blockierung durch join() aufgehoben.

put(item[, block[, timeout]])

Element in die Warteschlange stellen.

  1. Wenn der optionale Parameterblock True ist und Timeout ein leeres Objekt ist (Standard, blockierender Aufruf, kein Timeout).

  2. Wenn Timeout eine positive Ganzzahl ist, wird der aufrufende Prozess für bis zu Timeout-Sekunden blockiert. Wenn kein leerer Speicherplatz verfügbar ist, wird eine vollständige Ausnahme (Blockieren des Anrufs mit Timeout) ausgelöst geworfen.

  3. Wenn der Block „Falsch“ ist, werden die Daten in die Warteschlange gestellt, wenn freier Speicherplatz verfügbar ist. Andernfalls wird sofort eine vollständige Ausnahme ausgelöst.

Dies ist nicht der Fall -blockierende Version für

entspricht put_nowaitput(item, False)

get([block[, timeout]])

entfernt ein Element aus der Warteschlange und gibt es zurück. Die Block- und Timeout-Parameter sind die gleichen wie bei der

-Methode put

. Ihre nicht blockierende Methode ist `get_nowait()`, was

get(False)

empty()

Wenn die Warteschlange leer ist, geben Sie True zurück, andernfalls geben Sie False zurück

Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung des Python-Warteschlangenmoduls. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage