queue --- eine synchronisierte Warteschlangenklasse

Gendai: Lib/queue.py


Das Modul queue implementiert Multi-Produzenten- und Multi-Consumer-Warteschlangen. Dies ist besonders nützlich bei der Thread-Programmierung, bei der Nachrichten sicher zwischen mehreren Threads ausgetauscht werden müssen. Die Klasse Queue im Modul implementiert alle erforderlichen Sperrsemantiken.

Dieses Modul implementiert drei Arten von Warteschlangen. Der einzige Unterschied zwischen ihnen besteht in der Reihenfolge, in der Einträge extrahiert werden. In der FIFO-Warteschlange werden zuerst hinzugefügte Aufgaben zuerst abgerufen. In einer LIFO-Warteschlange werden die zuletzt hinzugefügten Einträge zuerst abgerufen (ähnlich einem Stapel). In der Prioritätswarteschlange bleiben die Einträge sortiert (unter Verwendung des Moduls heapq ) und der Eintrag mit dem kleinsten Wert wird zuerst abgerufen.

Intern verwenden diese drei Arten von Warteschlangen Sperren, um konkurrierende Threads vorübergehend zu blockieren; sie sind jedoch nicht für den Thread-Wiedereintritt konzipiert.

Darüber hinaus implementiert das Modul einen „einfachen“ FIFO-Warteschlangentyp, SimpleQueue , diese spezielle Implementierung stellt eine kleine Funktion im Austausch bereit zusätzlicher Schutz.

Das Modul queue definiert die folgenden Klassen und Ausnahmen:

class queue.Queue(maxsize=0)

Konstruktor für eine FIFO-Warteschlange. maxsize ist eine Ganzzahl, die die Obergrenze für die Anzahl der Elemente festlegt, die in die Warteschlange gestellt werden können. Das Einfügen wird blockiert, sobald diese Größe erreicht ist, bis Warteschlangenelemente verbraucht sind. Wenn maxsize kleiner oder gleich Null ist, ist die Warteschlangengröße unendlich.

class queue.LifoQueue(maxsize=0)

LIFO-Warteschlangenkonstruktor. maxsize ist eine Ganzzahl, mit der die Obergrenze der Anzahl der Elemente festgelegt wird, die in die Warteschlange gestellt werden können. Wenn diese Größe erreicht ist, wird der Einfügevorgang blockiert, bis die Elemente in der Warteschlange verbraucht sind. Wenn maxsize kleiner oder gleich Null ist, ist die Warteschlangengröße unendlich.

Klasse queue.PriorityQueue(maxsize=0)

Konstruktor der Prioritätswarteschlange. maxsize ist eine Ganzzahl, mit der die Obergrenze der Anzahl der Elemente festgelegt wird, die in die Warteschlange gestellt werden können. Wenn diese Größe erreicht ist, wird der Einfügevorgang blockiert, bis die Elemente in der Warteschlange verbraucht sind. Wenn maxsize kleiner oder gleich Null ist, ist die Warteschlangengröße unendlich.

Der Eintrag mit dem niedrigsten Wert wird zuerst extrahiert (der Eintrag mit dem niedrigsten Wert ist derjenige, der von min(entries) zurückgegeben würde). Das typische Muster für einen Eintrag ist ein Tupel der Form: (priority_number, data).

Wenn Daten -Elemente nicht vergleichbar sind, werden die Daten in eine Klasse eingeschlossen, wobei der Datenwert ignoriert und nur die Prioritätszahl verglichen wird: < /span>

Aus Datenklassen Datenklasse, Feld importieren
von der Eingabe von import Any

@dataclass(order=True)
Klasse PrioritizedItem:
    Priorität: int
    item: Any=field(compare=False)

Klasse queue.SimpleQueue

Unbegrenzter FIFO-Warteschlangenkonstruktor. Einfache Warteschlange, ohne erweiterte Funktionen wie Aufgabenverfolgung.

Neue Funktionen in Version 3.7.

Ausnahme queue.Empty

Für ein leeres Queue -Objekt rufen Sie nicht blockierendes get()< auf Ausnahme ausgelöst, wenn a i=4> (oder get_nowait()).

Ausnahme queue.Full

Für ein vollständiges Queue -Objekt rufen Sie nicht blockierendes put()< auf Ausnahme wird ausgelöst, wenn a i=4> (oder put_nowait()).

Warteschlangenobjekt

Sequenz von Spalten (QueueLifoQueue, oder jemand < /span> ) Stellt eine beschreibende öffentliche Methode in der unteren Zeile bereit. PriorityQueue

Queue.qsize()

Gibt die ungefähre Größe der Warteschlange zurück. Beachten Sie, dass qsize() > 0 nicht garantiert, dass nachfolgende get() nicht blockiert werden, und qsize() < maxsize nicht garantiert, dass put() nicht blockiert wird.

Queue.empty()

Wenn die Warteschlange leer ist, geben Sie True zurück, andernfalls geben Sie False zurück. Wenn empty() True zurückgibt, gibt es keine Garantie dafür, dass nachfolgende Aufrufe von put() nicht blockiert werden. Wenn empty() ebenfalls False zurückgibt, gibt es keine Garantie dafür, dass nachfolgende Aufrufe von get() nicht blockiert werden.

Queue.full()

Wenn die Warteschlange voll ist, geben Sie True zurück, andernfalls geben Sie False zurück. Wenn full() True zurückgibt, gibt es keine Garantie dafür, dass nachfolgende Aufrufe von get() nicht blockiert werden. Wenn full() ebenfalls False zurückgibt, gibt es keine Garantie dafür, dass nachfolgende Aufrufe von put() nicht blockiert werden.

Queue.put(itemblock=Truetimeout=None)

 Element zur Warteschlange hinzufügen. Wenn das optionale Argument block wahr ist und timeout ist  ist falsch) wird der Eintrag zur Warteschlange hinzugefügt, wenn der freie Slot sofort verfügbar ist, andernfalls wird Block -Ausnahme aus, wenn keine freien Slots verfügbar sind. In anderen Fällen (Full blockiert Sekunden und löst eine Timeout eine positive Zahl ist, wird es für bis zu TimeoutNone (Standardwert), es wird bei Bedarf blockiert, bis ein freier Steckplatz verfügbar ist. Wenn  -Ausnahme (Timeout wird in diesem Fall ignoriert).

Queue.put_nowait(item)

äquivalent put(item, block=False).

Queue.get(block=Truetimeout=None)

Entfernt ein Element aus der Warteschlange und gibt es zurück. Wenn der optionale Parameter Block wahr ist und Timeout  < ist a i=5> (Standard), blockiert bei Bedarf, bis das Element verfügbar ist. Wenn timeout eine positive Zahl ist, werden höchstens timeout Sekunden blockiert . Wenn der Artikel in diesem Zeitraum nicht abgerufen werden kann, wird eine Empty -Ausnahme ausgelöst. Im Gegenteil (Block ist falsch): Wenn ein Artikel sofort verfügbar ist, wird ein Artikel zurückgegeben, andernfalls wird Empty ausgelöst  Ausnahme (in diesem Fall wird Timeout ignoriert). None

Auf POSIX-Systemen vor 3.0 und auf allen Windows-Versionen, wenn block wahr ist und < a i=3> Wenn die Zeitüberschreitung  beträgt, führt dieser Vorgang zu einem ununterbrochenen Warten auf die zugrunde liegende Sperre. Dies bedeutet, dass keine Ausnahmen auftreten, insbesondere wird SIGINT keinen KeyboardInterrupt auslösen. None

Queue.get_nowait()

äquivalent get(False) .

Es stehen zwei Methoden zur Verfügung, um die Verfolgung zu unterstützen, ob die in der Warteschlange befindliche Aufgabe vollständig vom dämonisierten Verbraucherthread verarbeitet wird.

Queue.task_done()

gibt an, dass die zuvor in der Warteschlange befindliche Aufgabe abgeschlossen wurde. Wird vom Consumer-Thread der Warteschlange verwendet. Jedes get() wird verwendet, um eine Aufgabe zu erhalten, und nachfolgende Aufrufe task_done() Teilen Sie der Warteschlange mit, dass die Verarbeitung der Aufgabe abgeschlossen ist.

Wenn join() derzeit blockiert, wird die Blockierung aufgehoben, nachdem alle Einträge verarbeitet wurden (d. h. jeder  werden alle empfangen). task_done() Einträge in die Warteschlange 

Wenn der Aufruf öfter erfolgt, als Elemente in die Warteschlange gestellt werden, wird eine ValueError -Ausnahme ausgelöst.

Queue.join()

Blockiert, bis alle Elemente in der Warteschlange empfangen und verarbeitet wurden.

Die Anzahl der ausstehenden Aufgaben wird erhöht, wenn ein Eintrag zur Warteschlange hinzugefügt wird. Der ausstehende Zähler wird jedes Mal dekrementiert, wenn ein Verbraucherthread task_done() aufruft, um anzuzeigen, dass der Eintrag abgerufen wurde und alle Arbeiten daran abgeschlossen wurden. Wenn die ausstehende Anzahl auf Null sinkt, wird join() die Blockierung aufheben.

Beispiel für das Warten auf den Abschluss einer Aufgabe in der Warteschlange:

Threading importieren
Importwarteschlange

q = queue.Queue()

def worker():
    während True:
        item = q.get()
        print(f'Arbeite an {item}')
        print(f'Fertig {item}')
        q.task_done()

# Aktivieren Sie den Arbeitsthread.
threading.Thread(target=worker, daemon=True).start()

# Senden Sie dreißig Aufgabenanfragen an den Mitarbeiter.
für Artikel im Bereich(30):
    q.put(item)

# Blockieren, bis alle Aufgaben erledigt sind.
q.join()
print('Alle Arbeiten abgeschlossen')

SimpleQueue-Objekt

Das Objekt SimpleQueue stellt die unten beschriebenen öffentlichen Methoden bereit.

SimpleQueue.qsize()

Gibt die ungefähre Größe der Warteschlange zurück. Beachten Sie, dass qsize() > 0 nicht garantiert, dass nachfolgende get() nicht blockiert werden.

SimpleQueue.empty()

Wenn die Warteschlange leer ist, geben Sie True zurück, andernfalls geben Sie False zurück. Wenn empty() False zurückgibt, gibt es keine Garantie dafür, dass nachfolgende Aufrufe von get() nicht blockieren.

SimpleQueue.put(itemblock=Truetimeout=None)

Legen Sie Element in die Warteschlange. Diese Methode blockiert nie und ist immer erfolgreich (außer bei potenziellen Fehlern auf niedriger Ebene, z. B. Fehlern bei der Speicherzuweisung). Die optionalen Parameter block und timeout dienen nur der Persistenz  Aus Kompatibilitätsgründen mit Queue.put() bereitgestellt, wird sein Wert ignoriert.

CPython-Implementierungsdetails: Diese Methode verfügt über eine reentrant C-Implementierung. Das heißt, ein put() - oder get() -Aufruf kann durch einen anderen put() -Aufruf im selben Thread unterbrochen werden, ohne dass es zum Tod kommt. Sperren oder zerstören Sie den interner Status der Warteschlange. Dadurch eignet es sich für Destruktoren wie __del__ -Methoden oder weakref -Rückrufe.

SimpleQueue.put_nowait(item)

entspricht put(item, block=False) und wird bereitgestellt, um die Kompatibilität mit Queue.put_nowait() aufrechtzuerhalten.

SimpleQueue.get(block=Truetimeout=None)

Entfernt ein Element aus der Warteschlange und gibt es zurück. Wenn der optionale Parameter Block wahr ist und Timeout  < ist a i=5> (Standard), blockiert bei Bedarf, bis das Element verfügbar ist. Wenn timeout eine positive Zahl ist, werden höchstens timeout Sekunden blockiert . Wenn der Artikel in diesem Zeitraum nicht abgerufen werden kann, wird eine Empty -Ausnahme ausgelöst. Im Gegenteil (Block ist falsch): Wenn ein Artikel sofort verfügbar ist, wird ein Artikel zurückgegeben, andernfalls wird Empty ausgelöst  Ausnahme (in diesem Fall wird Timeout ignoriert). None

SimpleQueue.get_nowait()

äquivalent get(False) .

Sehen

Funktion multiprocessing.Queue

Eine Warteschlangenklasse zur Verwendung in Multiprozesskontexten (anstelle von Multithreading).

collections.deque ist eine alternative Implementierung einer unbegrenzten Warteschlange, die schnell ist, keine Sperren erfordert und die Atomizität von Indizes unterstützt append()< / a> -Operationen. popleft() - und 

おすすめ

転載: blog.csdn.net/TalorSwfit20111208/article/details/134982133