在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
中并不是一个好主意,因为这会被发送到客户端,但是我还在哪里存储它?
(与this question相关,但更为一般。我希望答案完全不同。)
答案 0 :(得分:3)
看看delayed_job。您可以轻松地对此进行扩展,以便作业可以将进度写入delayed_jobs
表,以便通过check_status()
方法进行后续提取(或者甚至可以将set_status()
和check_status()
添加到delayed_job ...)
请注意,delayed_job最初是从Shopify中提取的;我猜这意味着它有一些可靠的真实曝光。除非我有一个非常令人信服的理由,否则我宁愿从这样的基础开始而不是自己开始。
答案 1 :(得分:1)
您可以将状态存储在模型中,并将status_id放入会话中。或者,您可以使用数据库会话存储而不是基于cookie的存储,这将使您在服务器端放入会话的数据以牺牲会话速度为代价。