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