使用ruby的异步HTTP请求

时间:2012-02-18 21:34:11

标签: ruby http asynchronous eventmachine

我有一个充满请求的rabbitmq队列,我希望以异步方式将请求作为HTTP GET发送,而无需等待每个请求响应。现在我对什么是更好用,线程或只是EM感到困惑?我现在使用它的方式如下所示,但是很高兴知道这里是否有更好的性能以及更好的性能,因为它是该程序的一个非常关键的部分:

AMQP.start(:host => "localhost") do |connection|
  queue = MQ.queue("some_queue")
  queue.subscribe do |body|
    EventMachine::HttpRequest.new('http://localhost:9292/faye').post :body => {:message =>  body.to_json }
  end
end

使用上面的代码,系统是否会在开始下一个请求之前等待每个请求完成?如果有任何提示,我会非常感激

1 个答案:

答案 0 :(得分:1)

HTTP是同步的,因此您必须等待回复。如果您想模拟一个异步环境,您可以拥有一个线程池并将每个请求传递给一个等待回复的线程,那么请回到池中直到下一个请求。您可以向线程发送一个回调函数,以便在回复完成时使用,或者您将立即返回一个将来的回复对象,这样您就可以推迟等待回复,直到您确实需要回复数据为止。

另一种方法是拥有一个进程池,每个进程都在处理请求,等待回复等。

在这两种情况下,你必须有一个足够大的游泳池,否则你仍然会在某些时候等待。