ruby eventmachine http-запрос откладывается

Это мой первый раз с EM, поэтому мне действительно нужна помощь.

так вот код:

EM.run do
  queue = EM::Queue.new
  EM.start_server('0.0.0.0', '9000', RequestHandler, queue)

  puts 'Server started on localhost:9000' # Any interface, actually

  process_queue = proc do |url|
    request = EM::HttpRequest.new(url, connect_timeout: 1).get # No time to wait, sorry

    request.callback do |http| # deferrable
      puts http.response_header.status
    end

    queue.pop(&process_queue)
  end

  EM.next_tick { queue.pop(&process_queue) }
end

Я прочитал пару статей о EM, теперь мое понимание приведенного выше кода следующее:

EM::HttpRequest является отложенным, что означает, что он не будет блокировать реактор. Но когда я пытаюсь запустить 50 одновременных соединений с ab, одновременно обслуживается только около 20 (согласно отчету ab).

Но если я помещу выполнение process_queue внутрь EM.defer (что означает, что оно будет выполняться в отдельном потоке?), оно будет работать нормально.

Почему это так? process_queue просто инициализирует отложенный объект и назначает обратный вызов, как его запуск внутри EM.defer имеет значение?


person Vlad Khomich    schedule 28.11.2012    source источник


Ответы (1)


Одна вещь, которую вы можете сделать, это поместить queue.pop(&process_queue) в обратном вызове process_queue внутри EM.next_tick. В настоящее время вы собираетесь обрабатывать все соединения в очереди, прежде чем разрешать подключение чему-либо новому. Если вы поместите queue.pop в вызов next_tick, вы позволите реактору выполнить некоторую работу, прежде чем вы обработаете следующий элемент.

person dj2    schedule 06.12.2012