2

我有一個類(/lib/updater.rb),可以大量更新數據庫(調用外部服務器,計算,...)。通常這個任務是由服務器的cron調用的(rake /lib/tasks/launch_updater.rake,啓動updater.rb),但我希望有機會從客戶端手動啓動它。Rails - 從控制器運行rake任務或新線程?

此時,從客戶端,用戶可以點擊一個按鈕,並以這種方式啓動它:

# the controller 
Thread.new { 
    Updater.start 
} 

這是一個很好的解決方案或者是更直接從rake任務啓動?

# something like this from the controller 
Rake::Task[params[:task]].reenable 
Rake::Task[params[:task]].invoke 

該任務應該是無阻塞的(用戶應該在應用中正常導航而不必等待任務結束)。

哪個更好?爲什麼?

+3

可以使用延遲工作寶石做到這一點。看看這個https://github.com/collectiveidea/delayed_job – Arun

+0

+1 @Arun謝謝你是一個很好的選擇,但是你對我的2個解決方案有什麼想法? – damoiser

+1

恕我直言,線程不是一個好主意。做它作爲背景工作是最適合您的要求。在控制器中調用rake任務是不好的做法。 – Arun

回答

0

工作在我的問題有點,我發現了以下事項:

使用線程時
  • ,所使用的CPU是在應用程序的CPU相同(即使你有一個多核服務器, CPU是一樣的)。如果你想使用線程,線程任務不應該「沉重」,或者你可能會遇到CPU問題(緩慢的應用程序處理)。
  • 當您從終端或服務器cron啓動一個Rake任務時,應該使CPU的運行過程更輕鬆。但是,如果你從應用程序啓動一個任務,我認爲CPU甚至在這裏應用程序的相同。
  • 更好的解決方案與重收費工作的工作是利用延遲服務,以這種方式工作的任務應該採取另一種CPU比應用程序的CPU,無需在應用程序的性能使問題: