我正在研究一个负责同时聚合来自多个站点的数据的类。它应该并行向所有站点发出请求,收集结果,然后将它们返回给调用者。所有调用都需要在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
我的代码有两个问题:
有没有办法让它在Thin下运行?因为Thin已经有一个事件循环,所以在完成多个请求时阻塞将永远不会完成,因为我已经在上面写了它。然而,我仍然希望在从aggregate
返回之前阻止完成多请求。换句话说,我想在EventMachine中使用EventMachine。
轮询永远不是答案。还有其他方法可以写出来吗?