Ruby是否有任何类似于Clojure的pmap的构造用于并行处理?

我正在尝试决定是在Ruby还是Clojure中实现一个应用程序。 其中两项要求涉及并行处理:

  1. 该应用必须进行并行调用才能通过互联网获取XML Feed和其他类型的数据。 进行了许多这样的调用,并且序列化调用效率低下。

  2. 理想情况下,对这些呼叫的响应应该并行处理。 处理主要是指将原始XML转换为更小的结构化数据(Ruby散列或Clojure映射)并将其插入MySQL数据库或CouchDB数据库。

我知道Ruby比Clojure好很多,但如果这是Clojure的正确项目,我就是全部使用它。

Clojure的pmap函数似乎是这两个要求的理想选择。 我想知道一些Ruby库或function是否有类似干净和简单的方法来执行上述并行处理任务。

这是一个简单的小例子,有一种方法可以做到这一点。 请注意,没有什么限制它一次创建的线程数,因此如果您运行大量线程,可能需要创建某种线程池。

 [1,2,3].map{|x| Thread.start{x+1}}.map{|t| t.join.value} 

使pmap函数可重用也同样简单:

 module Enumerable def pmap map {|x| Thread.start {yield x}}.map {|t| t.join.value} end end 

但是,当然,使用适当的线程池/执行程序可能是个好主意。 这是一个例子 。

我认为实现语言的选择取决于您的应用程序。

如果你是网络绑定的,Ruby应该可以正常工作。 您可能会发现使用带有EventMachine的reactor模式实现并发请求更容易。 您可以使用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中进行处理会更容易并行,而且反正速度更快。