2010-01-26 62 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的數據庫會話存儲,這會使會話速度降低到服務器端的會話中。