我正在尝试决定是在Ruby还是Clojure中实现一个应用程序。其中两项要求涉及并行处理:
应用必须进行并行调用才能通过互联网获取XML Feed和其他类型的数据。进行了许多此类调用,并且序列化调用效率低下。
理想情况下,对这些调用的响应应该并行处理。处理主要是指将原始XML转换为更小的结构化数据(Ruby哈希或Clojure映射)并将其插入MySQL数据库或CouchDB数据库。
我比Clojure更了解Ruby,但如果这是Clojure的正确项目,我就是全部使用它。
Clojure的pmap
函数似乎是这两个要求的理想选择。我想知道一些Ruby库或功能是否有类似干净和简单的方法来完成上述并行处理任务。
答案 0 :(得分:2)
使pmap
函数可重用是同样简单的:
module Enumerable
def pmap
map {|x| Thread.start {yield x}}.map {|t| t.join.value}
end
end
但是,当然,使用正确的线程池/执行器可能是个好主意。这是an example。
答案 1 :(得分:1)
这是一个简单的小例子,有一种方法可以做到这一点。请注意,没有什么限制它一次创建的线程数,因此如果您运行大量线程,可能需要创建某种线程池。
[1,2,3].map{|x| Thread.start{x+1}}.map{|t| t.join.value}
答案 2 :(得分:1)
我认为实现语言的选择取决于您的应用程序。
如果你是网络绑定的,Ruby应该可以正常工作。您可能会发现使用reactor pattern EventMachine实现并发请求更容易。您可以使用EventMachine::Protocols::HttpClient类发出HTTP请求。
EventMachine.run {
http = EventMachine::Protocols::HttpClient.request(
:host => server,
:port => 80,
:request => "/index.xml"
)
http.callback {|response|
# process response
}
}
这样您就不必担心并发性和所有相关的复杂性,但是由于您可以发出大量并发请求,因此您将拥有高吞吐量。
如果你受CPU限制,这将无效。如果您花费大部分时间处理XML提要而不是等待I / O来获取提要或插入数据库,则必须在JRuby上运行Ruby或运行多个Ruby进程以实现良好的多核利用率。
在CPU绑定的情况下,我会使用Clojure,因为如果你真的是CPU绑定的话,那么在Clojure中进行处理会更容易并行,而且反正速度更快。