Ruby有没有类似于Clojure的pmap进行并行处理的构造?

时间:2011-02-16 16:37:21

标签: ruby clojure

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

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

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

  3. 我比Clojure更了解Ruby,但如果这是Clojure的正确项目,我就是全部使用它。

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

3 个答案:

答案 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中进行处理会更容易并行,而且反正速度更快。