并发模型:Erlang vs Clojure

我们将使用Clojure编写一个并发程序,该程序将从大量传入的邮件中提取关键字,这些邮件将与数据库进行交叉检查。

我的一个队友build议使用Erlang编写这个程序。

在这里,我想说明一些我对函数式编程的新东西,所以我有点怀疑clojure是编写这个程序的好select,还是Erlang更适合。

两种语言和运行时采用不同的并发方法:

  • Erlang构造了许多相互之间进行通信的轻量级进程。 在这种情况下,您可能会有一个主进程将作业和数据发送给许多工作人员,并且有更多进程来处理结果数据。

  • Clojure倾向于使用公共数据结构来共享数据和状态的devise。 这听起来特别适合于许multithreading访问相同数据(只读)并且共享很less可变状态的情况。

您需要分析您的应用程序,以确定哪种模型最适合您。 这也可能取决于您使用的外部工具 – 例如,数据库处理并发请求的能力。

另一个实际的考虑是clojure运行在许多开源库可用的JVM上。

你真的是指并发或分布?

如果你的意思是并发(multithreading,多核心等),那么我会说Clojure是自然的解决scheme。

  • Clojure的STM模型是完全为多核并发devise的,因为它在存储和pipe理线程之间的共享状态方面非常高效。 如果你想了解更多,非常值得看这个优秀的video 。
  • Clojure STM允许并发线程安全地对数据进行突变。 Erlang避免了这个问题,使所有的东西都是不可变的,这本身就很好,但是当你真的需要共享可变状态的时候并没有什么帮助。 如果你想在Erlang中共享可变状态,你必须用一组既不高效也不方便的消息交互来实现它(这是一个没有共享模型的代价……)
  • 如果你在一个大型机器的并发环境中,你将会获得更好的Clojure性能,因为Clojure不依赖消息传递,因此线程之间的通信可以更有效率。

如果你的意思是分布式的(也就是说许多不同的机器通过一个networking共享工作,那么这个networking就可以作为独立的进程来运行)

  • Erlang的不可变的,没有共享的消息传递风格迫使你用一种可以分布的方式编写代码。 因此,惯用的Erlang可以自动地分布在多台机器上并运行在一个分布式的容错设置中。
  • 因此,Erlang对这个用例的优化非常好,所以会是自然的select,而且肯定是最快的工作。
  • Clojure也可以做到这一点,但是你需要自己做更多的工作(也就是说,你需要实现或者select某种forms的分布式计算框架) – Clojure目前默认没有这样的框架。

从长远来看,我希望Clojure开发一个与Erlang相匹配的分布式计算框架 – 那么你就可以拥有两全其美了!

Clojure是运行在Java JVM上的Lisp。 Erlang的devise从高度容错和并发。

我相信这个任务可以用这些语言和许多其他语言来完成。 你的经验将取决于你对这个问题的理解程度以及你对语言的了解程度。 如果你对这两者都是陌生的,那么无论你select哪一个,我都会说这个问题会有挑战性。

你有没有想过像Lucene / Solr的东西? 这是伟大的索引和search文件的软件。 我不知道“交叉检查”对于你的情况意味着什么,但这可能是一个很好的解决scheme。

我的方法是用每种语言写一个简单的testing,并testing每个语言的性能。 这两种语言都与C风格的语言有些不同,如果你不习惯它们(而且你没有一个习惯于它们的团队),你最终可能会面临维护的噩梦。

我也看看使用Groovy 1.8。 Groovy现在包括GPars以支持并行计算。 Groovy中的string和文件操作确实很容易。

  1. 这取决于你的意思是巨大的。
  2. erlang中的string是痛苦的

但:

如果巨大的意味着数十台分布式机器,比用erlang写文本友好的语言(python ?, perl?)工作。 您将拥有高度并发的本地工作人员的分布层。 每个工人将由erlang进程表示。 如果你需要更多的performance,把你的工作人员改写成C语言。在Erlang里,和其他语言交stream是非常容易的。

如果巨大还意味着一台强大的机器和JVM一起去。 那不是那么庞大。

如果数以百计的机器数量巨大,我认为你可能需要在C ++堆栈上更强大的谷歌(bigtable,map / reduce)。 Erlang还是可以的,但是你需要好的开发者来编写代码。