Celery так же эффективен в локальной системе, как многопроцессорная обработка на Python? - PullRequest
17 голосов
/ 12 февраля 2012

У меня возникли некоторые проблемы, связанные с выбором многопроцессорной обработки python, сельдерея или pp для моего приложения.

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

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

Спасибо!

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

Ответы [ 2 ]

22 голосов
/ 08 апреля 2013

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

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

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

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

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

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

4 голосов
/ 12 февраля 2012

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

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

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

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

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

...