我正在使用Ruby on Rails 4.2。在控制器中,我有一种方法需要花费大量时间才能完成一些繁重的计算。我想通知用户计算进度。我的想法是让@progress变量在计算过程中进行更新,并由处理来自前端的AJAX请求的不同操作读取。但是这个想法失败了-当变量以long方法更新时,我总是在AJAX操作中使用默认值0。我试过@@ progress,$ progress和session [:progress],但结果完全一样。 现在,我正在考虑建立一个模型,用于在数据库中存储进度并从中读取进度,但是我不敢相信无法通过一些更简单的方法来完成。 请分享您的想法!
答案 0 :(得分:3)
理论上:
在这些情况下,通常的方法是从HTTP处理程序进程异步执行作业(因此,最终用户等待Web服务器响应的时间不会太长)。
这意味着:
实用(以上理论在Rails应用程序中的应用):
后台作业:Rails社区提供了各种各样的gem(+内置解决方案ActiveJob
)来执行异步作业(=后台任务)。它们可以分为2个主要类别:
DelayedJob
,Que
等(保持文件系统上的队列,如果服务器重新启动则可以恢复队列)Resque
,Sidekiq
等(通常更快,但是如果服务器重新启动,则会丢失队列)面向客户端: 这里有两个主要选项:
基于意见的
如果要保持简单,我将采用一个非常简单的实现:Resque
用于后端,而轮询系统用于前端。
如果您希望完成某些事情,能够抵抗服务器重新启动并恢复崩溃前的状态,则可以使用持久化版本(例如DelayedJob
),也可以使用自己的内存解决方案持久的逻辑。