2012-12-14 29 views
3

我有一個webservice處理用戶提交的數據。用戶不需要接收基於該數據的響應,他只需要提交它。但是,我確實需要處理這些數據。目前處理直接作爲對帖子動作的響應,並且在處理之後,它返回狀態碼。當用戶提交大量數據時,這通常需要0.5s - 2s,但有時會更長。是否有可能在rails中返回響應並繼續處理客戶端提交的數據?

是否有可能在Rails中產生一個處理該數據的新線程,同時返回狀態碼(從而完成對用戶的請求)?

+0

任何理由不這樣做異步同樣的事情? – AJcodez

回答

2

我想你可以在後臺處理數據,使用類似resque的東西。

1

您還可以使用fork - 它不是一個完美的解決方案,但它能夠完成任務,並介紹了沒有額外的移動部件。要做到這一點叉在整個Rails應用程序(相當混亂,但服務的要求會立即響應Rails應用程序),並有脫落的過程:

class SomeController < ApplicationController 
    def heavy_lifting 
    process = fork do 
     # calculate PI or process input 
     # ... 
     # sends the kill signal to current Process, which is the Rails App actually calculating PI 
     Process.kill("HUP") 
    end 
    Process.detach(process) 
    # respond here 
    end 
end 

記住
雖然你處理/工作可能只需要幾兆內存運行,fork分配與父進程一樣多的內存。這是一個很好的summary of what fork generally does

更新 - 使用線程

class SomeController < ApplicationController 
    def heavy_lifting 
    Thread.new do 
     # calculate PI or process input 
     # ... 
     Thread.kill 
    end 
    # respond here 
    end 
end 
+0

所以,在控制器中不能簡單地執行'Thread.new {do_something(@data)}'這樣的操作? – Peterdk

+0

確定你可以使用線程,只要你不''加入'他們回來並妥善殺死他們。 – krichard

+0

@krichard不知何故,在這裏,控制器正在等待分叉塊完成發回響應。這可以取決於服務器設置嗎? – oldergod

相關問題