2012-02-12 1 views
13

У меня проблемы с выбором решения для многопроцессорности python или сельдерея или pp для моего приложения.Насколько эффективен сельдерей на локальной системе, поскольку многопроцессорность python?

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

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

Спасибо!

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

+0

Что заставляет вас думать, что несколько процессоров помогут IO-тяжелому применению? Если ваше приложение IO-bound, вам нужно несколько каналов ввода-вывода, а не CPU. –

+0

Противоположное извините неправильное слово ... это очень интенсивный процессор. В основном это просто математика в большой рекурсии с большим количеством данных. Казалось, хороший процесс для распространения – Lostsoul

+0

Ah - в этом случае продолжайте :) Нужна ли вам отказоустойчивость - например, попытка использовать волонтерские вычисления, разбросанные повсюду, или вы просто хотите использовать компьютеры в лаборатории или кластер? –

ответ

4

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

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

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

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

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

+2

Сельдерей действительно имеет больше накладных расходов, чем использование multiprocessing.Pool напрямую, из-за служебных сообщений. Сельдерей очень хорошо справляется с проблемами сбоев в любой форме, а также поддерживает временные рамки и многое, многое другое. Celery использует улучшенную версию многопроцессорного пула (celery.concurrency.processes.pool.Pool), которая поддерживает ограничения по времени и исправляет множество ошибок, связанных с запуском пула в качестве службы (т. Е. Работает навсегда) и ошибок, связанных с отключением. Некоторые люди используют версию пула сельдерея. – asksol

+0

Некоторые ссылки: http://docs.celeryproject.org/en/latest/userguide/workers.html#time-limits http://docs.celeryproject.org/en/latest/userguide/workers.html#revoking-tasks Варианты пула: http://docs.celeryproject.org/en/latest/internals/reference/celery.concurrency.processes.pool.html#celery.concurrency.processes.pool.Pool http://docs.celeryproject.org/ ru/latest/internals/reference/celery.concurrency.processes.pool.html # celery.concurrency.processes.pool.Pool.apply_async – asksol

+2

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

17

Я только что закончил тест, чтобы решить, сколько сельдерея добавляется как накладные расходы на 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: 

и только resarrays защищены замок.

+1

Мне удалось отделить настройку пула от измерения, но это практически не имело разницы (как и ожидалось, вилка дешева). Попытка с использованием другого набора данных (276, 385, 3821): сельдерей через маринованный перевал 38 с, многопроцессорность. Честно говоря, я считаю, что сельдерей гораздо удобнее работать, и он может естественным образом делегировать обработку другим машинам в случае, если время обработки действительно больше, чем время передачи. На одной машине разница в производительности становится заметной только для больших наборов данных. –

Смежные вопросы