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

Concurrency модель: Erlang vs Clojure

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

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

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

4b9b3361

Ответ 1

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

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

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

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

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

Ответ 2

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

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

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

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

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

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

Ответ 3

Clojure работает Lisp на Java JVM. Erlang спроектирован с нуля, чтобы быть высоко отказоустойчивым и параллельным.

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

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

Ответ 4

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

Я также хотел бы использовать что-то вроде Groovy 1.8. Groovy теперь включает в себя GPars для обеспечения параллельных вычислений. Управление строкой и файлами в Groovy очень просто.

Ответ 5

  • Это зависит от того, что вы подразумеваете под огромным.
  • Строки в erlang болезненны.

а

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

Если огромная по-прежнему означает, что одна сильная машина идет с JVM. Тогда он не огромен.

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