2015-07-05 11 views
12

W Pythonie podczas używania moduł Multiprocessing są 2 rodzaju kolejki:Kolejka vs JoinableQueue Pythona

  • kolejki
  • JoinableQueue.

Jaka jest różnica między nimi?

kolejki

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 

Odpowiedz

16

JoinableQueue posiada metody join() i task_done(), które Queue nie.


klasy multiprocessing.Queue ([MAXSIZE])

Zwraca proces wspólny kolejka realizowane za pomocą rury i niektóre zamknięcia/semafory. Kiedy proces najpierw umieszcza element w kolejce, rozpoczyna się wątek podajnika, który przenosi obiekty z bufora do potoku.

Zwykłe wyjątki Queue.Empty i Queue.Full z modułu kolejki biblioteki standardowej są wywoływane, aby sygnalizować limity czasu.

Kolejka implementuje wszystkie metody Queue.Queue z wyjątkiem task_done() i join().


klasy multiprocessing.JoinableQueue ([MAXSIZE])

JoinableQueue, podklasa kolejce, jest kolejką, który dodatkowo zawiera task_done()() i łączą metod.

task_done()

wskazują, że dawniej skolejkowany zadaniem jest kompletna. Używany przez wątki klientów kolejki. Dla każdego get() używanego do pobrania zadania, kolejne wywołanie task_done() informuje kolejkę o zakończeniu przetwarzania zadania.

Jeśli funkcja join() jest obecnie blokowana, zostanie wznowiona, gdy wszystkie elementy zostaną przetworzone (co oznacza, że ​​wywołanie task_done() zostało odebrane dla każdego elementu, który został wstawiony() do kolejki).

Powoduje podniesienie wartości ValueError, jeśli jest wywoływana więcej razy niż pozycje umieszczone w kolejce.

przyłączenia()

grupowego do wszystkich pozycji w kolejce zostały dostał i przetwarzane.

Liczba nieukończonych zadań wzrasta po dodaniu elementu do kolejki. Liczba ta spada, gdy wątek konsumenta wywoła metodę task_done(), aby wskazać, że element został pobrany, a wszystkie prace nad nim zakończone.Kiedy liczba niedokończonych zadań spadnie do zera, join() odblokowuje się.


Jeśli używasz JoinableQueue następnie należy zadzwonić JoinableQueue.task_done() dla każdego zadania usunięte z kolejki lub innego semafora używanego policzyć liczbę niedokończonych zadań może ostatecznie przepełnienia, podnoszenie wyjątek.