我们将使用Clojure编写并发程序,该程序将从大量传入邮件中提取关键字,这些邮件将与数据库进行交叉检查。
我的一个队友建议使用Erlang来编写这个程序。
在这里,我想注意一些我对函数式编程不熟悉的事情,所以我有点怀疑clojure是编写这个程序的好选择,还是Erlang更适合。
答案 0 :(得分:61)
你真的是指并发或分发吗?
如果你的意思是并发(多线程,多核等),那么我会说Clojure是天生的解决方案。
如果你的意思是分布式(即许多不同的机器通过网络共享工作,它们作为独立的进程有效运行),那么我会说Erlang是更自然的解决方案:
从长远来看,我希望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)
但:
如果巨大意味着数十台分布式计算机,那么请使用文本友好语言(python?,perl?)来使用erlang和编写工作程序。您将在高层并发的本地工作者的顶层分布层。每个工人都将由erlang进程代表。如果您需要更高的性能,请将您的工作人员重写为C.在Erlang中,与其他语言交谈非常容易。
如果巨大仍然意味着一台强大的机器与JVM一起使用。那不是很大。
如果巨大的是数百台机器,我认为你可能需要更强大的谷歌类似(bigtable,map / reduce)可能在C ++堆栈上。 Erlang仍然可以,但是你需要好的开发人员来编写代码。