1

我想使用 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 可以支持这个用例吗?

4

0 回答 0