ruby eventmachine http-request deferrable

时间:2012-11-28 16:34:55

标签: ruby eventmachine em

这是我第一次使用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内运行它会如何产生影响?

1 个答案:

答案 0 :(得分:2)

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