阻止EventMachine :: Multi请求

时间:2012-03-15 15:05:11

标签: ruby asynchronous eventmachine

我正在研究一个负责同时聚合来自多个站点的数据的类。它应该并行向所有站点发出请求,收集结果,然后将它们返回给调用者。所有调用都需要在aggregate方法返回时完成。

此外,该方法将在Rails控制器的上下文中运行,它可能会也可能不会在公平的Web服务器下运行。

基于EM的纯版本代码如下:

class DataAggregator
  def aggregate(artist)
    multi = EventMachine::MultiRequest.new

    EventMachine.run do
      multi.add :a, EventMachine::HttpRequest.new("http://www.postrank.com").get
      multi.add :b, EventMachine::HttpRequest.new("http://www.google.com").get
      multi.add :c, EventMachine::HttpRequest.new("http://www.github.com").get
      multi.add :d, EventMachine::HttpRequest.new("http://www.yahoo.com").get
      multi.add :e, EventMachine::HttpRequest.new("http://www.facebook.com").get

      multi.callback do
        puts "Done!"
        EventMachine.stop unless defined?(Thin)
      end
    end

    # Not optimal, but I don't see any way to do this otherwise.
    unless multi.finished?
      sleep 0.1
    end
  end
end

我的代码有两个问题:

  1. 有没有办法让它在Thin下运行?因为Thin已经有一个事件循环,所以在完成多个请求时阻塞将永远不会完成,因为我已经在上面写了它。然而,我仍然希望在从aggregate返回之前阻止完成多请求。换句话说,我想在EventMachine中使用EventMachine。

  2. 轮询永远不是答案。还有其他方法可以写出来吗?

1 个答案:

答案 0 :(得分:2)

我不再顽固,试了Typhoeus。这个场景 Just Works 。正如这里提到的另一个线程,在异步调用上阻塞是两个世界中最糟糕的。