Модель параллелизма: Erlang vs Clojure - PullRequest
54 голосов
/ 05 июня 2011

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

Один из моих товарищей по команде предложил использовать Erlang для написания этой программы.

Здесь я хочу отметить кое-что, что я новичок в функциональном программировании, поэтому я немного сомневаюсь, является ли clojure хорошим выбором для написания этой программы, или Erlang больше подходит.

Ответы [ 5 ]

61 голосов
/ 06 июня 2011

Вы действительно имеете в виду одновременный или распределенный?

Если вы имеете в виду одновременный (многопоточный, многоядерный и т. Д.), То я бы сказал, что Clojure - это естественное решение.

  • Модель Clomure STM идеально подходит для нескольких-core параллелизм, поскольку он очень эффективен при хранении и управлении общим состоянием между потоками.Если вы хотите понять больше, стоит посмотреть это отличное видео .
  • Clojure STM позволяет безопасно изменять данные параллельными потоками.Erlang обходит эту проблему, делая все неизменным, что само по себе прекрасно, но не помогает, когда вам действительно нужно общее изменяемое состояние.Если вам нужно общее изменяемое состояние в Erlang, вы должны реализовать его с помощью набора взаимодействий между сообщениями, который не является ни эффективным, ни удобным (это цена модели без совместного использования ресурсов ....)
  • Вы получите по своей сутилучшая производительность с Clojure, если вы работаете в параллельном режиме на большой машине, поскольку Clojure не полагается на передачу сообщений и, следовательно, связь между потоками может быть намного более эффективной.

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

  • Неизменный стиль обмена сообщениями Erlang, не требующий совместного использования, вынуждает васписать код так, чтобы его можно было распространять.Таким образом, идиоматический Erlang автоматически может быть распределен по нескольким машинам и работать в распределенной, отказоустойчивой настройке.
  • Поэтому Erlang очень хорошо оптимизирован для этого варианта использования, поэтому будет естественным выбороми, безусловно, это будет самый быстрый способ начать работу.
  • Clojure мог бы сделать это также, но вам нужно будет сделать гораздо больше работы самостоятельно (т.е. вам нужно будет либо внедрить, либо выбрать какую-либо форму распределенной вычислительной среды)) - Clojure в настоящее время не поставляется с такой платформой по умолчанию.

В долгосрочной перспективе я надеюсь, что Clojure разработает среду распределенных вычислений, соответствующую Erlang - тогда вы сможете получить лучшее из обоих миров!

48 голосов
/ 05 июня 2011

Два языка и среды выполнения используют разные подходы к параллелизму:

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

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

Вам необходимо проанализировать ваше приложение, чтобы определить, какая модель вам подходит. Это также может зависеть от внешних инструментов, которые вы используете - например, от способности базы данных обрабатывать параллельные запросы.

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

8 голосов
/ 05 июня 2011

Clojure - это Lisp, работающий на Java JVM.Erlang с самого начала разрабатывался с учетом высокой отказоустойчивости и одновременности.

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

Вы думали о чем-то вроде Lucene / Solr?Это отличное программное обеспечение для индексации и поиска документов.Я не знаю, что означает «перекрестная проверка» для вашего контекста, но это может быть хорошим решением для рассмотрения.

0 голосов
/ 07 июня 2011

Мой подход состоит в том, чтобы написать простой тест на каждом языке и проверить производительность каждого из них.Оба языка несколько отличаются от языков стиля C, и если вы к ним не привыкли (и у вас нет команды, которая к ним привыкла), вы можете столкнуться с кошмаром обслуживания.Также взглянем на использование чего-то вроде Groovy 1.8.Groovy теперь включает GPar для параллельных вычислений.Работа со строками и файлами в Groovy действительно очень проста.

0 голосов
/ 06 июня 2011
  1. Это зависит от того, что вы подразумеваете под огромным.
  2. Струны в эрланге болезненны.

но:

Если огромный означает десятки распределенных машин, чем идти с erlang и писать рабочие тексты на дружественных тексту языках (python ?, perl?). Вы будете иметь распределенный слой на вершине с высокопараллельными местными работниками. Каждый работник будет представлен процессом Erlang. Если вам нужна более высокая производительность, перепишите своего работника на C. В Erlang очень легко разговаривать на других языках.

Если огромный означает еще одну сильную машину, используйте JVM. Тогда оно невелико.

Если огромное количество машин - сотни, я думаю, вам понадобится что-то более сильное, похожее на google (bigtable, map / lower), вероятно, в стеке C ++. Erlang все еще в порядке, однако вам понадобятся хорошие разработчики для его кодирования.

...