2012-12-14 32 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

相关问题