并发模型:Erlang vs Clojure

时间:2011-06-05 16:21:22

标签: concurrency clojure erlang

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

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

在这里,我想注意一些我对函数式编程不熟悉的事情,所以我有点怀疑clojure是编写这个程序的好选择,还是Erlang更适合。

5 个答案:

答案 0 :(得分:61)

你真的是指并发或分发吗?

如果你的意思是并发(多线程,多核等),那么我会说Clojure是天生的解决方案。

  • Clojure的STM模型完美地设计用于多核并发,因为它非常有效地存储和管理线程之间的共享状态。如果你想了解更多,那么值得关注this excellent video
  • Clojure STM允许并发线程安全地突变数据。 Erlang通过使所有东西都不可变来回避这个问题,这本身就很好,但是当你真正需要共享的可变状态时却无济于事。如果你想在Erlang中使用共享的可变状态,你必须使用一组消息交互来实现它,这既不高效又不方便(这是无共享模型的价格......)
  • 如果您在大型机器中进行并发设置,那么使用Clojure可以获得更好的性能,因为Clojure不依赖于消息传递,因此线程之间的通信可以更加高效。

如果你的意思是分布式(即许多不同的机器通过网络共享工作,它们作为独立的进程有效运行),那么我会说Erlang是更自然的解决方案:

  • Erlang的不可变,无共享,消息传递风格迫使您以可分发的方式编写代码。因此,惯用的Erlang 自动可以分布在多台机器上,并在分布式容错环境中运行。
  • 因此,Erlang对这个用例进行了非常优化,因此这将是最自然的选择,并且肯定是最快的工作。
  • Clojure也可以这样做,但你需要自己做更多的工作(即你需要实现或选择某种形式的分布式计算框架) - Clojure目前没有这样的框架

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

答案 1 :(得分:47)

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

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

  • Clojure赞成一种设计,其中多个线程使用通用数据结构共享数据和状态。这听起来特别适合于许多线程访问相同数据(只读)并且共享很少可变状态的情况。

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

另一个实际考虑因素是clojure在JVM上运行,其中有许多开源库可供使用。

答案 2 :(得分:8)

Clojure是在Java JVM上运行的Lisp。 Erlang从一开始就设计为具有高度容错性和并发性。

我相信这项任务对任何一种语言和其他语言都是可行的。您的经验将取决于您对问题的理解程度以及您对语言的了解程度。如果你是两个新手,我会说无论你选择哪一个,问题都将是挑战。

你有没有想过像Lucene / Solr这样的东西?它是索引和搜索文档的绝佳软件。我不知道“交叉检查”对您的上下文意味着什么,但这可能是一个很好的解决方案。

答案 3 :(得分:0)

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

我还会考虑使用像Groovy 1.8这样的东西。 Groovy现在包含支持并行计算的GPars。 Groovy中的字符串和文件操作非常容易。

答案 4 :(得分:-4)

  1. 这取决于你的意思。
  2. erlang中的字符串很痛苦......
  3. 但:

    如果巨大意味着数十台分布式计算机,那么请使用文本友好语言(python?,perl?)来使用erlang和编写工作程序。您将在高层并发的本地工作者的顶层分布层。每个工人都将由erlang进程代表。如果您需要更高的性能,请将您的工作人员重写为C.在Erlang中,与其他语言交谈非常容易。

    如果巨大仍然意味着一台强大的机器与JVM一起使用。那不是很大。

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