这是我第一次使用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
是可延迟的,这意味着它不会阻塞反应堆。
但是,当我尝试与ab
运行50个并发连接时,它仅同时服务~20个(根据ab
报告)。
但是如果我将process_queue
执行放在EM.defer
内(这意味着它将在一个单独的线程中运行?)它执行得很好。
为什么会这样? process_queue
只是插入一个可延迟的对象并指定一个回调,在EM.defer
内运行它会如何产生影响?
答案 0 :(得分:2)
您可能想要做的一件事是将queue.pop(&process_queue)
放在process_queue
内的EM.next_tick
回调中。目前,您将在允许任何新连接之前处理所有排队连接。如果您将queue.pop
放入next_tick
调用,您将让反应堆在处理下一个项目之前完成一些工作。