2014-11-08 34 views
1

我正在尋找一種方法,可以在頁面呈現給用戶之後運行一些較慢的代碼。具體而言,我希望能夠做這樣的事情:將頁面呈現給用戶之後運行代碼(Sinatra)

get '/fast-action' do 
    compute_after_render { put some slow code here } 
    'request successful' 
end 

我想到了將關於計算到數據庫中的信息。 然後運行諸如rufus調度程序之類的東西,它將檢查是否有某件事每分鐘計算一次。
但我不希望用戶等待數據庫來完成插入。

有沒有什麼辦法讓頁面呈現給用戶後,Sinatra運行一些代碼?

回答

1

您可以使用streaming responses

get '/fast-action' do 
    stream do |out| 
    out << 'request successful' 
    put some slow code here 
    out << " " 
    end 
end 

要知道,雖然,該服務器線程將被阻止該請求的持續時間(和緩慢的代碼當然執行)。

1

是的,一個快速簡便的方法是開始一個新的線程:

get '/fast-action' do 
    body 'request successful' 
    Thread.new{ slow code } 
end 
1

我建議你看看到邊的工作。我喜歡用這個Sidekiq寶石。它使用Redis存儲需要運行的作業並每隔一段時間檢查一次。這是完全可配置的,所有這一切。如果您正在運行稍後可以完成的工作,例如發送電子郵件,處理圖像等,並運行長時間的流程,我強烈建議您使用它。

相關問題