Bru*_*man 9 ruby ruby-on-rails thin sinatra eventmachine
我一直在研究用EventMachine来处理一些工作的可能性.在Sinatra中,这似乎工作得很好,但Rails 3似乎在渲染视图之前执行所有刻度.
当我在瘦Web服务器下运行以下代码时,它的行为与预期一致.第一个请求立即返回,第二个请求正在等待3秒睡眠呼叫完成.这是预期的行为.
class EMSinatra < Sinatra::Base
get "/" do
EM.next_tick { sleep 3 }
"Hello"
end
end
Run Code Online (Sandbox Code Playgroud)
在Rails 3运行中,我正在尝试做同样的事情:(在瘦下运行)
class EmController < ApplicationController
def index
EM.next_tick {
sleep(3)
}
end
end
Run Code Online (Sandbox Code Playgroud)
在Rails中,睡眠调用在将视图呈现给浏览器之前发生.结果是我等待3秒钟才能渲染初始页面.
有人知道为什么会这样吗?我不是在寻找评论,这是一个好的做法.我只是在试验.将小任务投入反应堆循环似乎是一件值得探讨的事情.如果我要进行一些非阻塞的http请求,为什么客户端必须等待?
我不确定这是否是您正在寻找的答案,但我之前对此进行了一些研究。让我告诉你一些背景信息:我们想要实现的是,即使控制器操作需要很长时间才能加载,rails 也已经刷新了模板树的部分(例如布局的第一部分)。这样做的效果是,当网络服务器仍在工作时,用户已经在浏览器中看到了一些内容。当然,主视图必须等待渲染,因为它可能需要来自控制器操作的数据。
这种技术也称为 BigPipe,Facebook 写了一篇关于此的不错的博客: http://www.facebook.com/notes/facebook-engineering/bigpipe-pipelined-web-pages-for-high-performance/389414033919
不管怎样,在做了一些研究以实现 Rails 3 的这一目标之后,我发现了 Yehuda Katz 发表的这篇博客文章。 http://yehudakatz.com/2010/09/07/automatic-flushing-the-rails-3-1-plan/
所以现在我认为你真的必须坚持等待控制器
| 归档时间: |
|
| 查看次数: |
3091 次 |
| 最近记录: |