/ / Queue vs JoinableQueue in Python - Python, Warteschlange, Multiprocessing

Warteschlange vs JoinableQueue in Python - Python, Warteschlange, Multiprocessing

In Python gibt es beim Verwenden des Multiprocessing-Moduls zwei Arten von Warteschlangen:

  • Warteschlange
  • JoinableQueue.

Was ist der Unterschied zwischen ihnen?

from multiprocessing import Queue
q = Queue()
q.put(item) # Put an item on the queue
item = q.get() # Get an item from the queue

JoinableQueue

from multiprocessing import JoinableQueue
q = JoinableQueue()
q.task_done() # Signal task completion
q.join() # Wait for completion

Antworten:

18 für die Antwort № 1

JoinableQueue hat Methoden join() und task_done(), welche Queue hasn "t.


Klasse Multiprocessing.Queue ([maxsize])

Gibt eine gemeinsam genutzte Warteschlange zurück, die mit implementiert wurdeeine Pfeife und ein paar Schlösser / Semaphore. Wenn ein Prozess zum ersten Mal ein Element in die Warteschlange stellt, wird ein Feeder-Thread gestartet, der Objekte aus einem Puffer in die Pipe überträgt.

Die üblichen Ausnahmen Queue.Empty und Queue.Full vom Warteschlangenmodul der Standardbibliothek werden ausgelöst, um Timeouts zu signalisieren

Queue implementiert alle Methoden von Queue.Queue mit Ausnahme von task_done () und join ().


Klasse Multiprocessing.JoinableQueue ([maxsize])

JoinableQueue, eine Warteschlangenklasse, ist eine Warteschlange, die zusätzlich die Methoden task_done () und join () enthält.

task_done ()

Geben Sie an, dass es sich bei einer zuvor in der Warteschlange befindlichen Aufgabe umKomplett. Wird von Warteschlangen-Consumer-Threads verwendet. Für jedes get (), das zum Abrufen einer Task verwendet wird, teilt ein nachfolgender Aufruf von task_done () der Warteschlange mit, dass die Verarbeitung der Task abgeschlossen ist.

Wenn ein join () derzeit blockiert, wird er fortgesetzt, wenn alle Elemente verarbeitet wurden (was bedeutet, dass ein task_done () - Aufruf für jedes Element empfangen wurde, das in die Warteschlange gestellt wurde).

Löst einen ValueError aus, wenn er öfter aufgerufen wird als in der Warteschlange befindliche Elemente.

Beitreten()

Blockieren, bis alle Elemente in der Warteschlange abgerufen und verarbeitet wurden.

Die Anzahl der unfertigen Aufgaben steigt immer anElement wird der Warteschlange hinzugefügt. Der Zähler geht zurück, wenn ein Consumer-Thread task_done () aufruft, um anzuzeigen, dass das Element abgerufen wurde und alle Arbeiten daran abgeschlossen sind. Wenn die Anzahl der nicht abgeschlossenen Aufgaben auf null fällt, gibt join () die Blockierung auf.


Wenn du benutzt JoinableQueue dann musst du anrufen JoinableQueue.task_done() Für jede Aufgabe, die aus der Warteschlange entfernt wurde, kann der Semaphor, mit dem die Anzahl der nicht abgeschlossenen Aufgaben gezählt wird, möglicherweise überlaufen, was zu einer Ausnahme führt.