0

我在 Raiscast 上关注了这个关于 Resque 的教程:http: //railscasts.com/episodes/271-resque

在教程中,有一个关于代码荧光笔的示例,它位于控制器的 #create 方法中:

def create
  @snippet = Snippet.new(params[:snippet])
  if @snippet.save
    uri = URI.parse('http://pygments.appspot.com/')
    request = Net::HTTP.post_form(uri, {'lang' => @snippet.language, 'code' => @snippet.plain_code})
    @snippet.update_attribute(:highlighted_code, request.body)
    redirect_to @snippet, :notice => "Successfully created snippet."
  else
    render 'new'
  end
end

据说

“通过 Rails 请求与外部服务通信通常是一个坏主意,因为它们可能会响应缓慢,因此会占用整个 Rails 进程和任何其他尝试连接它的请求。最好将外部请求移出到“

它想说的是:Resque 有助于加快 Rails 应用程序的速度。但是,我不太明白为什么/如何将这段代码移出控制器来加速应用程序。它寻找我只是将它从控制器移动到另一个库。谁能给我解释一下?

4

1 回答 1

4

如果您查看应用程序正在做什么,它正在调用外部应用程序 (pygments.appspot.com) 来执行突出显示。

让我们假设这个网站很受欢迎,因此需要 20 秒来响应。使用控制器中的代码,您的应用程序将花费您处理响应所需的时间,加上 pygments 在您的用户看到响应之前的 20 秒。

当您将其移至后台作业时,这 20 秒现在发生在后台,用户将能够看到响应,但不会突出显示语法。如果他们在突出显示完成后在 20 秒内刷新,那么他们会看到它。

因此,要回答您的问题,将代码移动到应用程序中的其他位置并不能加快速度。代码不会运行得更快。将代码移动到 abackground job意味着对速度的影响不会影响对用户的响应时间。

于 2012-09-27T14:44:53.343 回答