Это мой первый раз с 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
имеет значение?