Подтвердить что ты не робот

Насколько сельдерей эффективен в локальной системе, поскольку многопроцессорность python?

У меня проблемы с выбором решения для многопроцессорности python или celery или pp для моего приложения.

Мое приложение очень тяжелое для процессора, но в настоящее время оно использует только один процессор, поэтому мне нужно распространять его на все доступные процессоры (что заставило меня посмотреть на библиотеку многопроцессорности python), но я читал, что эта библиотека не масштабируется для других машин если необходимо. Прямо сейчас я не уверен, что мне понадобится более одного сервера для запуска моего кода, но я думаю о локальном использовании сельдерея, а затем масштабирование потребует добавления новых серверов вместо рефакторинга кода (как если бы я использовал многопроцессорная).

Мой вопрос: правильно ли эта логика? и существует ли какая-либо отрицательная (производительность) с использованием сельдерея на местном уровне (если окажется, что один сервер с несколькими ядрами может выполнить мою задачу)? или более рекомендуется использовать многопроцессорность и вырасти из нее во что-то еще?

Спасибо!

p.s. это для личного учебного проекта, но я, возможно, когда-нибудь буду работать в качестве разработчика в фирме и хочу узнать, как это делают профессионалы.

4b9b3361

Ответ 1

Я действительно никогда не использовал Сельдерей, но я использовал многопроцессорность.

Кажется, что сельдерей имеет несколько способов передачи сообщений (задач), включая способы, которыми вы должны иметь возможность запускать рабочих на разных машинах. Таким образом, недостатком может быть то, что передача сообщений может быть медленнее, чем при многопроцессорной обработке, но, с другой стороны, вы могли бы распространять нагрузку на другие машины.

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

Я не знаю, насколько хорошо Сельдерей справится с проблемами. Например, задача может никогда не завершиться, или может произойти сбой, или вы можете захотеть убить задачу, если она не закончилась в определенный промежуток времени. Я не знаю, как трудно было бы добавить поддержку для этого, если его там нет.

многопроцессорность не поставляется с отказоустойчивостью из коробки, но вы можете самостоятельно ее создать без особых проблем.

Ответ 2

Я только что закончил тест, чтобы решить, сколько сельдерей добавляется как накладные расходы на multiprocessing.Pool и общие массивы. Тест запускает фильтр wiener на массиве uint16 (292, 353, 1652). Обе версии используют один и тот же фрагмент (примерно: разделите размеры 292,353 на квадратный корень из числа доступных процессоров). Были опробованы две версии сельдерея: одно решение отправляет маринованные данные, другое открывает основной файл данных у каждого работника.

Результат: на моем 16-ядерном процессоре i7 процессор занимает около 16 с, multiprocessing.Pool с общим массивом около 15 секунд. Я нахожу это различие удивительно маленьким.

Увеличение гранулярности значительно увеличивает разницу (сельдерей должен передать больше сообщений): сельдерей занимает 15 с, multiprocessing.Pool занимает 12 с.

Учтите, что работники сельдерея уже бегали на хозяине, тогда как работники пула раздвоены при каждом прогоне. Я не уверен, как запустить пул многопроцессорности в начале, поскольку я передаю совместно используемые массивы в инициализаторе:

with closing(Pool(processes=mp.cpu_count(), initializer=poolinit_gen, initargs=(sourcearrays, resarrays))) as p:

и только ретрансляторы защищены блокировкой.