如何在不停止EventMachine的情况下完成HTTP请求?

时间:2015-07-27 19:47:43

标签: ruby parallel-processing eventmachine em-http-request

我想使用Ruby EventMachine和em-http-request来运行从不同线程触发的并行HTTP 同步请求。

这个想法是在自己的线程中运行一个反应器,并通过EM.next_tick推送HTTP请求在其事件队列上完成。

每次通话的模式可以是

def complete_request(url, options)
  Thread.new { EM.run } unless EM.reactor_running?
  EM.run do
    EM.next_tick do
      con = EventMachine::HttpRequest.new(url, options[:connection_headers])
      http = com.setup_request(verb, head: options[:headers], body: options[:body])
      http.errback { }
      http.callback { }
    end
  end
  # wait for request completion (but how?)
  ...
end

reqs = []
responses = []
reqs << Thread.new { responses << complete_request('http://www.stackoverflow.com', verb: get) }
reqs << Thread.new { responses << complete_request('http://www.flickr.com', verb: get) }
reqs.each { |req| req.join }    

为了使请求同步,我尝试使用Fibers但未成功。请求无法连接或完成但从未退出事件循环。

我不想在回调中调用EM.stop,因为它会搞砸其他并行执行的请求,我想也会停止反应堆,而我希望它运行直到我决定不再请求应该得到治疗。

有没有人已经尝试过这种方式使用EventMachine和em-http-request? EventMachine可以支持这个用例吗?

0 个答案:

没有答案