multiprocessing
формирует свои очереди из queue.Queue
. В этой модели Queue
ведет «счетчик задач» всего, что помещено в очередь. Обычно есть два способа использовать эту очередь. Производители могли просто поставить вещи в очередь и игнорировать то, что с ними происходит в долгосрочной перспективе. Производитель может время от времени ждать, если очередь заполнена, но не заботится о том, действительно ли какие-либо вещи, помещенные в очередь, обрабатываются потребителем. В этом случае количество задач в очереди растет, но кого это волнует?
В качестве альтернативы, производитель может «присоединиться» к очереди. Это означает, что он ждет, пока последняя задача в очереди не будет обработана и счетчик задач не станет равным нулю. Но для этого производителю нужна помощь потребителя. Потребитель получает элемент из очереди, но это не уменьшает количество задач. Потребитель должен активно вызвать task_done
(обычно, когда задача выполнена ...), и join
будет ждать, пока каждый пут не получит task_done.
Быстрая перемотка к multiprocessing
. Механизм task_done требует связи между процессами, что относительно дорого. Если вы производитель типа A, который не играет в игру join
, используйте multiprocessing.Queue
и сэкономьте немного процессорного времени. Если вы производитель типа B, используйте multiprocessing.JoinableQueue
. Но помните, что потребитель также должен играть в игру task_done, иначе производитель зависнет.