0

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

4

1 回答 1

2

您可能想要做的一件事是将queue.pop(&process_queue)回调process_queue中的EM.next_tick. 目前,您将在允许任何新连接之前处理所有排队的连接。如果您将其queue.pop放入next_tick调用中,您将在处理下一个项目之前让反应器做一些工作。

于 2012-12-06T04:42:49.320 回答