0

我需要对控制器动作进行一些缓慢的操作。但不必等待此操作进行响应呈现。

class ProductController < ActionController
  def update
    slow_operations()
    render json: {status: 'ok'}
  end
end

即使我render在 Product#update 操作之后移动我的代码,它也不会减少响应时间。

class ProductController < ActionController
  def update
    render json: {status: 'ok'}
    slow_operations()
  end
end

如何在执行慢速操作之前强制返回完整响应?

4

2 回答 2

3

由于 Rails 的工作方式,它仍然会在动作完成后进行实际的“渲染” - 所以,正如您发现的那样,在您的动作中将“渲染”移动得更高并没有帮助。您需要做的是将长时间运行的操作改组到后台进程中。有很多 gems 可以做到这一点,包括BackgroundRbDelayed JobSidekiq(我个人最喜欢的,主要是因为它是多线程的,减少了您需要启动的进程数量,并且因为它的基于 Web 的管理/监控界面)。

甚至还有一个 Railscast 可以让你开始学习其中的大部分内容,比如这个:http ://railscasts.com/episodes/366-sidekiq

于 2013-01-28T23:15:02.883 回答
1

您需要集成ResqueGirl Friday之类的东西,以将缓慢的进程卸载到后台任务。

于 2013-01-28T23:11:06.127 回答