Queue vs JoinableQueue в Python

В Python при использовании многопроцессорного модуля есть 2 вида очередей:

  • Очередь
  • JoinableQueue.

В чем разница между ними?

Очередь

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 

JoinableQueue имеет методы join() и task_done() , которых нет в Queue .


class multiprocessing.Queue ([maxsize])

Возвращает очередь процессов, реализованную с использованием канала и нескольких блокировок / семафоров. Когда процесс сначала помещает элемент в очередь, запускается поток фидера, который переносит объекты из буфера в трубу.

Обычные исключения Queue.Empty и Queue.Full из модуля очереди стандартной библиотеки повышаются до таймаутов сигналов.

Queue реализует все методы Queue.Queue, за исключением task_done () и join ().


класс многопроцессорности. JoinableQueue ([maxsize])

JoinableQueue, подкласс Queue, представляет собой очередь, которая дополнительно имеет методы task_done () и join ().

task_done ()

Укажите, что ранее заданная задача завершена. Используется потоками потребителей в очереди. Для каждого get (), используемого для извлечения задачи, последующий вызов task_done () сообщает очереди, что обработка задачи завершена.

Если соединение в настоящее время блокируется, оно возобновляется, когда все элементы были обработаны (это означает, что для каждого элемента, который был помещен () в очередь, был получен вызов task_done ()).

Повышает значение ValueError, если вызывается больше раз, чем были помещены в очередь.

присоединиться()

Блокируйте, пока все элементы в очереди не будут получены и обработаны.

Количество незавершенных задач увеличивается, когда элемент добавляется в очередь. Счетчик прекращается всякий раз, когда потребительский поток вызывает task_done (), чтобы указать, что элемент был восстановлен, и все работа над ним завершена. Когда количество незавершенных задач падает до нуля, join () разблокируется.


Если вы используете JoinableQueue вы должны вызвать JoinableQueue.task_done() для каждой задачи, удаленной из очереди, или же семафор, используемый для подсчета количества незавершенных задач, может в конечном итоге переполнить, создавая исключение.