我有一個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