Как выполнить HTTP-запросы без остановки EventMachine?
Я хочу использовать Ruby EventMachine и em-http-request для параллельных HTTP- синхронных запросов, запускаемых из разных потоков.
Идея состоит в том, чтобы запустить один реактор в своем собственном потоке и отправить HTTP-запросы для завершения в свою очередь событий благодаря EM.next_tick.
Шаблон для каждого звонка может быть
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.stackru.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 поддерживать этот вариант использования?