这是我第一次接触 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
有何不同?