Thin EventMachine Sinatra vs. Rails

时间:2011-02-21 01:01:56

标签: ruby-on-rails ruby sinatra thin eventmachine

我一直在研究使用EventMachine来处理一些工作的可能性。在Sinatra中,这似乎工作得很好,但Rails 3似乎在渲染视图之前执行所有刻度。

当我在瘦Web服务器下运行以下代码时,它的行为与预期一致。第一个请求立即返回,第二个请求正在等待3秒睡眠呼叫完成。这是预期的行为。

class EMSinatra < Sinatra::Base
  get "/" do
    EM.next_tick { sleep 3 }
    "Hello"
  end
end

在Rails 3运行中,我正在尝试做同样的事情:(在瘦身下运行)

class EmController < ApplicationController
  def index
    EM.next_tick {
      sleep(3)
    }
  end
end

在Rails中,睡眠调用在将视图呈现给浏览器之前发生。结果是我等待3秒钟才能渲染初始页面。

有人知道为什么会这样吗?我不是在寻找评论,这是一个好的做法。我只是在试验。将小任务投入反应堆循环似乎是一件值得探讨的事情。如果我要进行一些非阻塞的http请求,为什么客户端必须等待?

2 个答案:

答案 0 :(得分:3)

我不确定这是你正在寻找的答案,但我之前做过一些研究。 让我告诉你一些背景信息: 我们想要实现的是,即使控制器动作需要很长时间才能加载,rails已经刷新了模板树的一部分(例如布局的第一部分)。 这样做的结果是,当Web服务器仍在工作时,用户已经在浏览器中看到了某些内容。 当然,主视图必须等待渲染,因为它可能需要来自控制器动作的数据。

这项技术也被称为BigPipe,facebook写了一篇关于此的好博客: http://www.facebook.com/notes/facebook-engineering/bigpipe-pipelining-web-pages-for-high-performance/389414033919

无论如何,在为rails 3做了一些研究之后,我发现了Yehuda Katz撰写的这篇博文。 http://yehudakatz.com/2010/09/07/automatic-flushing-the-rails-3-1-plan/

所以现在我认为你真的必须坚持等待控制器

答案 1 :(得分:0)

使用EM.defer而不是EM.next_tick导致在发回响应后发生睡眠。