2012-11-28 2 views
0

그래서 난 정말 여기 그래서 여기루비 eventmachine EM 내 처음이다

를 도움이 필요, 연기 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은 연기 가능한 것으로, 이는 원자로를 차단하지 않음을 의미합니다. 그러나 ab으로 50 개의 동시 연결을 실행하면 ab 보고서에 따라 동시에 20 개까지만 서비스합니다.

그러나 process_queue 실행을 EM.defer (즉, 별도의 스레드에서 실행한다는 것을 의미합니까?)에 배치하면 잘 수행됩니다.

왜 그렇습니까? process_queue 그냥 연기 가능한 객체를 입력하고 콜백을 지정합니다. 어떻게 실행합니까? EM.defer은 차이가 있습니까?

답변

2

queue.pop(&process_queue)process_queue 콜백에 넣고 EM.next_tick 안에 넣는 것이 좋습니다. 현재 새로운 연결을 허용하기 전에 대기중인 모든 연결을 처리하려고합니다. queue.popnext_tick 호에 넣으면 다음 항목을 처리하기 전에 원자로가 일부 작업을하도록합니다.

+0

와우, exectly 무엇이 필요합니다. 고마워요! –

관련 문제