2010-01-26 27 views
0

在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_progressget_progress函数?我在哪里存储状态?看起来将它存储在session中并不是一个好主意,因为这会发送给客户端,但是我还可以在哪里存储它?

(与this question,但更一般。我期待完全不同的答案。)

回答

3

看看delayed_job。你可以很容易地通过您的check_status()方法扩展这个让作业写入进度到delayed_jobs表,为后续提取(或你甚至可以添加set_status()check_status()到delayed_job的...)

注意的delayed_job最初从Shopify提取;我猜这意味着它有一些可靠的现实世界曝光。除非我有一个非常有说服力的理由,否则我宁愿从这样的基础开始,而不是从我自己的基础开始。

1

您可以将状态存储在一个模型,并把STATUS_ID到会话中。或者,您可以使用数据库会话存储而不是基于cookie的数据库会话存储,这会使会话速度降低到服务器端的会话中。