2012-11-28 4 views
0

Это мой первый раз с ЕМ, так что я действительно нужна помощь здесьрубин eventmachine HTTP-запрос откладываемые

так вот код:

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?

ответ

2

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

+0

wow, exectly, что мне нужно. Большое спасибо! –

 Смежные вопросы

  • Нет связанных вопросов^_^