并发模型:Erlang vs Clojure

Qua*_*han 54 concurrency erlang clojure

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

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

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

mik*_*era 62

你真的是指并发还是分发?

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

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

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

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

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

  • 并发和并行不是一回事.Erlang确实支持非常自然的并发性,并行方法也有效.STM,消息传递,承诺和期货都是获得并发和并行的有效选择.您需要哪一个由您想要解决的问题的性质决定. (9认同)
  • 不要忘记Erlang的每进程GC - 即使Clojure"开发了分布式计算框架",JVM的GC也不会与Erlang的GC匹配. (3认同)
  • 在erlang中,ETS表可用于共享可变状态. (2认同)

nim*_*odm 48

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

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

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

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

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

  • 好答案.虽然注意到Clojure并发STM模型同样适用,即使共享状态是可变的.事实上,协调共享可变状态的变化是Clojure STM方法的主要动机. (5认同)

duf*_*ymo 8

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

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

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

  • 我听说过很多关于Clojure的顶级并发模型,但Erlang的声誉更加稳固.这就是我怀疑的原因.虽然我对Clojure有点偏见,但我不想从它开始,后来面临陷阱.至于交叉检查,我的意思是将在字典中搜索来自邮件的那些关键字以对邮件进行排序. (2认同)