在rails中存储临时数据的位置
在Ruby中,我有一个控制器动作,可立即启动计算密集型任务,需要几秒钟。 我希望客户端轮询我的服务器并获取状态更新。
在我的控制器中:
def complex_task Thread.new do loop do one_part_of_the_computationally_intensive_task # Note how much progress we've made, in case the client asks. save_progress end end # returns to client straightaway, but task continues in background. end def check_status # Retrieve state in here. get_progress end
请注意check_status
如何拉出由单独线程存储的状态。
如何编写save_progress
和get_progress
函数? 我在哪里存储州? 似乎将它存储在session
并不是一个好主意,因为这会被发送到客户端,但我还能在哪里存储它?
(与这个问题有关 ,但更为一般。我期待完全不同的答案。)
看看delayed_job 。 您可以轻松地扩展它,以便作业可以将进度写入delayed_jobs
表,以便随后通过check_status()
方法提取(或者您甚至可以将set_status()
和check_status()
到delayed_job ……)
请注意,delayed_job最初是从Shopify中提取的; 我猜这意味着它有一些可靠的真实曝光。 除非我有一个非常令人信服的理由,否则我宁愿从这样的基础开始而不是自己开始。
您可以将状态存储在模型中,并将status_id放入会话中。 或者,您可以使用数据库会话存储而不是基于cookie的存储,这将使您在服务器端放入会话的数据以牺牲会话速度为代价。