我有一个webservice处理用户提交的数据。用户不需要接收基于该数据的响应,他只需要提交它。但是,我确实需要处理这些数据。目前处理直接作为对帖子动作的响应,并且在处理之后,它返回状态码。当用户提交大量数据时,这通常需要0.5s - 2s,但有时会更长。是否有可能在rails中返回响应并继续处理客户端提交的数据?
是否有可能在Rails中产生一个处理该数据的新线程,同时返回状态码(从而完成对用户的请求)?
我有一个webservice处理用户提交的数据。用户不需要接收基于该数据的响应,他只需要提交它。但是,我确实需要处理这些数据。目前处理直接作为对帖子动作的响应,并且在处理之后,它返回状态码。当用户提交大量数据时,这通常需要0.5s - 2s,但有时会更长。是否有可能在rails中返回响应并继续处理客户端提交的数据?
是否有可能在Rails中产生一个处理该数据的新线程,同时返回状态码(从而完成对用户的请求)?
Resque,Delayed Job或Sidekiq应该满足您的需求。
你可以找到链接到这三个,和一对夫妇在这里:https://www.ruby-toolbox.com/categories/Background_Jobs
我想你可以在后台处理数据,使用类似resque的东西。
您还可以使用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
任何理由不这样做异步同样的事情? – AJcodez