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