Как выполнить 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 поддерживать этот вариант использования?

0 ответов

Другие вопросы по тегам