Пул рабочих - это шаблон проектирования, целью которого является отделение сервисной логики от бизнес-логики.
Под служебной логикой подразумевается вся логика, необходимая для поддержки определенной задачи, такой как хранение и поиск данных, метрики, ведение журнала и обработка ошибок.
Вместо этого бизнес-логика относится к компонентам, которые выполняют «реальную работу», например, обогащают или преобразуют данные, генерируют статистику и т. Д.
Обычно реализуется с использованием Издателя / Подписчика шаблон проектирования, в котором один или несколько рабочих слушают очередь заданий, которая подается со стороны службы.
Большинство реализаций пула требуют, чтобы пользователь устанавливал статическое число работников во время своего объявления. Некоторые более продвинутые позволяют динамически изменять количество рабочих.
Задания могут планироваться неблокирующим (асинхронным) способом, позволяющим службе продолжать свой поток выполнения или в блокирующем (синхронном) режиме, останавливая выполнение дорезультаты не готовы.
В вашем конкретном примере вы объявляете пул с двумя работниками. Предполагая, что вы используете класс multiprocessing.Pool
, интерпретатор запустит 2 процесса, которые будут ожидать новых заданий. Когда вы вызываете map_async
, итерация разделяется на несколько кусков, которые ставятся в очередь во внутренней очереди пула. Рабочие будут выбирать фрагменты в порядке их поступления, запускать для них функцию action_fn
и публиковать результаты во второй очереди результатов, которая будет использована службой.
Несколько вызовов на map_async
приводят к добавлению большего количества патчей во внутреннюю очередь. Практически очередь бесконечна по размеру. Практически, если вам удастся заполнить его, последующий вызов map_async
будет блокироваться, пока рабочие не освободят место для новых заданий, которые будут поставлены в очередь.
Вам не нужно «убивать процесс, когдасделано ", так как Пул управляет рабочим процессом для вас прозрачным образом. Конкретно, процесс никогда не умирает. Он просто выбирает следующую задачу из очереди и выполняет ее, пока больше нет доступных задач. В этот момент он переходит в спящий режим до тех пор, пока новые задачи не будут запланированы или сам пул не будет завершен.