我需要对控制器动作进行一些慢速操作。但是没有必要等待此操作进行响应呈现。
class ProductController < ActionController
def update
slow_operations()
render json: {status: 'ok'}
end
end
即使我在产品#更新操作中render
之后移动我的代码,也不会缩短响应时间。
class ProductController < ActionController
def update
render json: {status: 'ok'}
slow_operations()
end
end
如何在执行慢速操作之前强制返回完整响应?
答案 0 :(得分:3)
由于Rails的工作方式,它仍然会在动作完成后进行实际的“渲染” - 因此,正如您所发现的那样,在您的动作中移动“渲染”并没有帮助。您需要做的是将长时间运行的操作拖入后台进程。有很多宝石可以做到这一点,包括BackgroundRb,Delayed Job和Sidekiq(我个人最喜欢的,主要是因为它是多线程的,减少了你需要启动的进程数量) ,以及它漂亮的基于Web的管理/监控界面)。
甚至还有一个Railscast让你开始大部分这样的活动,比如这个:http://railscasts.com/episodes/366-sidekiq
答案 1 :(得分:1)
您需要集成Resque或Girl Friday之类的内容,以便将缓慢的流程卸载到后台任务。