web-dev-qa-db-ja.com

並行処理モデル:ErlangとClojure

データベースとクロスチェックされる膨大な量の受信メールからキーワードを抽出するClojureを使用して、並行プログラムを作成します。

私のチームメイトの1人がこのプログラムを書くためにErlangを使うことを提案しました。

ここで、私が関数型プログラミングに不慣れなことに気づきたいので、このプログラムを書くのにclojureが適しているのか、それともErlangが適しているのか、少し疑問があります。

55
Quazi Farhan

2つの言語とランタイムは、並行性に対して異なるアプローチをとります。

  • Erlangは、相互に通信する多くの軽量プロセスとしてプログラムを構築します。この場合、多くのワーカーにジョブとデータを送信するマスタープロセスと、結果のデータを処理するためのより多くのプロセスがあります。

  • Clojureは、いくつかのスレッドが共通のデータ構造を使用してデータと状態を共有する設計を支持しています。これは、多くのスレッドが同じデータにアクセスし(読み取り専用)、変更可能な状態がほとんどない場合に特に適しています。

アプリケーションを分析して、最適なモデルを判別する必要があります。これは、使用する外部ツールにも依存します。たとえば、データベースが同時リクエストを処理する機能などです。

別の実用的な考慮事項は、clojureが多くのオープンソースライブラリが利用可能なJVMで実行されることです。

48
nimrodm

本当に同時または分散を意味しますか?

同時実行(マルチスレッド、マルチコアなど)を意味する場合は、Clojureが自然な解決策だと思います。

  • ClojureのSTMモデルは、スレッド間の共有状態を保存および管理するのに非常に効率的であるため、マルチコア同時実行用に完全に設計されています。あなたがもっと理解したいなら、見る価値がある この素晴らしいビデオ
  • Clojure STMは、並行スレッドによるデータの安全な変更を可能にします。 Erlangはすべてを不変にすることでこの問題を回避します。それ自体は問題ありませんが、共有の可変状態が本当に必要な場合は役に立ちません。 Erlangで共有の変更可能な状態が必要な場合は、効率的でも便利でもない一連のメッセージ対話を使用して実装する必要があります(これは、何も共有しないモデルの価格です...)。
  • Clojureはメッセージの受け渡しに依存しないため、大規模なマシンで並行設定を使用している場合、Clojureを使用すると、本質的にパフォーマンスが向上し、スレッド間の通信がはるかに効率的になります。

分散を意味している場合(つまり、ネットワーク上で分離されたプロセスとして効果的に実行されている多くの異なるマシンが作業を共有している場合)、Erlangがより自然な解決策だと思います。

  • Erlangの不変の、何も共有されていないメッセージパッシングスタイルでは、配布可能な方法でコードを記述する必要があります。したがって、慣用的なErlangautomaticallyを複数のマシンに分散し、分散型のフォールトトレラント設定で実行できます。
  • したがって、Erlangはこのユースケースに対して非常に最適化されているので、自然な選択であり、確実に最も早く動作します。
  • Clojureもそれを行うことができますが、自分でもっと多くの作業を行う必要があります(つまり、何らかの形の分散コンピューティングフレームワークを実装または選択する必要があります)-Clojureには現在、デフォルトでそのようなフレームワークが付属していません。

長期的には、ClojureがErlangと一致する分散コンピューティングフレームワークを開発してくれることを願っています。そうすれば、両方の長所を手に入れることができます。

62
mikera

Clojureは、Java JVMで実行されているLISPです。Erlangは、高度にフォールトトレラントで同時実行できるようにゼロから設計されています。

タスクはこれらの言語のいずれかと他の多くの言語でも実行可能だと思います。経験は、問題をどの程度理解しているか、言語をどれだけ理解しているかによって異なります。あなたが両方に不慣れな場合、どちらを選択しても問題は難しいと思います。

Lucene/Solrのようなものについて考えましたか?ドキュメントのインデックス作成と検索に最適なソフトウェアです。あなたのコンテキストにとって「クロスチェック」が何を意味するのかはわかりませんが、これは考慮すべき良い解決策かもしれません。

8
duffymo

私のアプローチは、各言語で簡単なテストを記述し、それぞれのパフォーマンスをテストすることです。どちらの言語もCスタイルの言語とは多少異なり、慣れていない場合(そして慣れているチームがない場合)は、メンテナンスの悪夢に終わる可能性があります。

Groovy 1.8のようなものを使用することも検討します。 Groovyには、並列計算を可能にするGParsが含まれています。 Groovyでの文字列とファイルの操作は非常に簡単です。

0
Fortyrunner