2012-11-28 21 views
0

這是我第一次用EM所以我真的需要一些幫助這裏紅寶石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是可推遲的,這意味着它不會阻塞反應堆。 但是,當我嘗試與ab一起運行50個併發連接時,它只能同時服務~20個(根據ab報告)。

但是,如果我將process_queue執行放在EM.defer(這意味着它將運行在一個單獨的線程中?)它執行得很好。

這是爲什麼? process_queue只是一個可延遲的對象,並指定一個回調,如何在EM.defer內運行它有所作爲?

回答

2

您可能想要做的一件事是將queue.pop(&process_queue)放在內的process_queue回調中。目前,您將在允許任何新連接之前處理所有排隊連接。如果您將queue.pop放入next_tick調用中,您將在處理下一個項目之前讓反應堆做一些工作。

+0

哇,無論如何我需要。非常感謝! –