0

我正在使用我的API的Sinatra gem。我想要做的是收到請求時處理它,返回響應並開始新的長時間運行的任務。Ruby線程/使用API​​(Sinatra)

我是Ruby的新手,我已閱讀了線程,但不知道什麼是完成我的任務的最佳方式。

這裏我sinatra端點

post '/items' do 
    # Processing data 
    # Return response (body ...) 
    # Start long running task 
    end 

我會的任何意見或例子感激。

回答

2

我相信更好的方式來做到這一點 - 就是使用後臺作業。當您的工作人員執行一些長時間運行的任務時,它不可用於新的請求。通過後臺工作 - 他們完成工作,而您的網絡工作人員可以處理新的請求。

你可以看看最流行的backgroung工作的寶石紅寶石爲出發點:resquedelayed_jobssidekiq

UPD:執行取決於所選擇的寶石,但總體方案將是這樣的:

# Controller 
post '/items' do 
    # Processing data 
    MyAwesomeJob.enqueue # here you put your job into queue 
    head :ok # or whatever 
end 

MyAwesomejob你實現你的長期任務捉迷藏

接下來,關於Mongoid和後臺作業。你應該從來沒有使用複雜的對象作爲工作參數。我不知道你正在執行什麼樣的任務,但有一般的答案 - 使用簡單的對象。

例如,不要使用User作爲參數,而要使用user_id,然後在作業中找到它。如果你這樣做,你可以使用任何數據庫沒有問題。

+0

謝謝你的回答,你能否提供一個例子來說明它在我的情況下的樣子,我的意思是返回響應並且不是添加背景作業,反之亦然?謝謝 – Putinhello

+0

還有一件事,我使用Mongoid來保存對象,我如何使用它或將對象傳遞給Sidekiq? – Putinhello

+0

@Putinhello更新了我的答案 – unkmas

0

同意unkmas。

有兩種方法可以做到這一點。 線程或像sidekiq這樣的後臺作業寶石。

如果處理時間不是很長,並且您不想爲工作人員編寫代碼,那麼線程將會非常好。但是如果你不使用線程池或者你期望突發HTTP流量,那麼你很可能會運行太多的線程。

最好的辦法是使用sidekiq或類似的東西。你甚至可以有一個像beanstalkd這樣的作業隊列,並將作業排入隊列並返回響應。您可以讓工作人員從隊列中讀取數據並稍後處理。