В чем разница между очередью и JoinableQueue при многопроцессорной обработке в Python? - PullRequest
0 голосов
/ 13 июля 2020

В чем разница между очередью и JoinableQueue при многопроцессорной обработке в Python? Этот вопрос уже задавался здесь , но, как отмечается в некоторых комментариях, принятый ответ бесполезен, потому что все, что он делает, - это цитирует документацию. Может ли кто-нибудь объяснить разницу в том, когда использовать одно по сравнению с другим? Например, зачем использовать Queue вместо JoinableQueue, если JoinableQueue - это почти то же самое, за исключением предложения двух дополнительных методов join() и task_done(). Кроме того, в другом ответе в сообщении, на которое я ссылался, упоминается, что Based on the documentation, it's hard to be sure that Queue is actually empty., что снова поднимает вопрос о том, зачем мне использовать Queue поверх JoinableQueue? Какие преимущества он предлагает?

1 Ответ

0 голосов
/ 13 июля 2020

multiprocessing формирует свои очереди из queue.Queue. В этой модели Queue ведет «счетчик задач» всего, что помещено в очередь. Обычно есть два способа использовать эту очередь. Производители могли просто поставить вещи в очередь и игнорировать то, что с ними происходит в долгосрочной перспективе. Производитель может время от времени ждать, если очередь заполнена, но не заботится о том, действительно ли какие-либо вещи, помещенные в очередь, обрабатываются потребителем. В этом случае количество задач в очереди растет, но кого это волнует?

В качестве альтернативы, производитель может «присоединиться» к очереди. Это означает, что он ждет, пока последняя задача в очереди не будет обработана и счетчик задач не станет равным нулю. Но для этого производителю нужна помощь потребителя. Потребитель получает элемент из очереди, но это не уменьшает количество задач. Потребитель должен активно вызвать task_done (обычно, когда задача выполнена ...), и join будет ждать, пока каждый пут не получит task_done.

Быстрая перемотка к multiprocessing. Механизм task_done требует связи между процессами, что относительно дорого. Если вы производитель типа A, который не играет в игру join, используйте multiprocessing.Queue и сэкономьте немного процессорного времени. Если вы производитель типа B, используйте multiprocessing.JoinableQueue. Но помните, что потребитель также должен играть в игру task_done, иначе производитель зависнет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...