首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Thin EventMachine Sinatra与Rails

Thin EventMachine Sinatra与Rails
EN

Stack Overflow用户
提问于 2011-02-21 09:01:56
回答 2查看 3.1K关注 0票数 9

我一直在研究用EventMachine做一些工作的可能性。在Sinatra中,这似乎工作得很好,但Rails3似乎会在渲染视图之前执行所有的计时。

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

代码语言:javascript
运行
复制
class EMSinatra < Sinatra::Base
  get "/" do
    EM.next_tick { sleep 3 }
    "Hello"
  end
end

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

代码语言:javascript
运行
复制
class EmController < ApplicationController
  def index
    EM.next_tick {
      sleep(3)
    }
  end
end

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

有人知道为什么会这样吗?我并不是在寻找关于这是不是一个好的实践的评论。我只是在做实验。将小任务放到反应堆循环中似乎是一件有趣的事情。如果我要发出一些非阻塞的http请求,为什么客户端必须等待?

EN

回答 2

Stack Overflow用户

发布于 2011-02-23 18:52:45

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

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

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

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

票数 3
EN

Stack Overflow用户

发布于 2012-10-06 13:20:44

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5061341

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档