Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Concurrency 并发模型:Erlang vs Clojure_Concurrency_Clojure_Erlang - Fatal编程技术网

Concurrency 并发模型:Erlang vs Clojure

Concurrency 并发模型:Erlang vs Clojure,concurrency,clojure,erlang,Concurrency,Clojure,Erlang,我们将使用Clojure编写一个并发程序,它将从大量传入邮件中提取关键字,这些邮件将与数据库进行交叉检查 我的一个队友建议使用Erlang编写这个程序 在这里我想指出的是,我对函数式编程还不熟悉,所以我有点怀疑clojure是编写这个程序的好选择,还是Erlang更合适 Clojure是在Java JVM上运行的Lisp。Erlang从一开始就被设计为具有高度的容错性和并发性 我相信这两种语言中的任何一种以及其他许多语言都可以完成这项任务。你的经验将取决于你对问题的理解程度以及你对语言的掌握程度

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

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


在这里我想指出的是,我对函数式编程还不熟悉,所以我有点怀疑clojure是编写这个程序的好选择,还是Erlang更合适

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

我相信这两种语言中的任何一种以及其他许多语言都可以完成这项任务。你的经验将取决于你对问题的理解程度以及你对语言的掌握程度。如果你对这两个都是新手,我想说,无论你选择哪一个,这个问题都是具有挑战性的


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

< P>两种语言和运行时采用不同的并发方式:

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

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

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

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

  • 这取决于你所说的“巨大”是什么意思
  • erlang中的字符串很痛苦
  • 但是:

    如果庞大意味着数十台分布式机器,那么就使用erlang,用文本友好的语言(python?、perl?)编写工作程序。您将在顶部有一个分布式层,其中包含高度并发的本地工作人员。每个worker将由erlang进程表示。如果您需要更高的性能,请将worker重写为C。在Erlang中,与其他语言交谈非常容易

    如果庞大仍然意味着一台强大的机器与JVM配合使用。那就不大了


    <如果巨大的是几百台机器,我想你可能需要更强大的谷歌(BigTabe,Map /Read)可能在C++堆栈上。Erlang仍然可以,但是您需要优秀的开发人员来编写它。

    您真的是指并发还是分布式

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

    • Clojure的STM模型是为多核并发而设计的,因为它在存储和管理线程之间的共享状态方面非常有效。如果你想了解更多,很值得一看
    • Clojure STM允许并发线程对数据进行安全变异。Erlang通过使所有内容都不可变来避免这个问题,这本身很好,但在您真正需要共享可变状态时却没有帮助。如果希望在Erlang中共享可变状态,则必须使用一组既不高效也不方便的消息交互来实现它(这是无共享模型的代价……)
    • 如果您在大型计算机中处于并发设置中,Clojure的性能将从本质上得到更好的表现,因为Clojure不依赖于消息传递,因此线程之间的通信可以更加高效
    如果您指的是分布式(即,许多不同的机器在网络上共享工作,这些机器作为隔离进程有效地运行),那么我认为Erlang是更自然的解决方案:

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

    从长远来看,我希望Clojure开发一个与Erlang相匹配的分布式计算框架,这样您就可以两全其美了

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


    我还将考虑使用Groovy1.8之类的东西。Groovy现在包括支持并行计算的GPAR。Groovy中的字符串和文件操作确实非常简单

    我听说过很多关于Clojure的顶级并发模型,但Erlang的名声要可靠得多。这就是我怀疑的原因。虽然我对Clojure有点偏见,但我不想一开始就这么做,然后再面对陷阱。至于交叉检查,我的意思是将在字典中搜索邮件中的关键词来对邮件进行排序。顺便说一句,Lucence/Solr在这方面看起来也很有趣。谢谢。您甚至可以将Lucence/Solr与clojure一起使用。它是世界上最好的。Erlang的字符串处理不是次优吗?(为了避免并发性讨论…)在我看来,如果误用Erlang,Erlang中的字符串处理是次优的。使用二进制文件非常有效