Rails - запустить задачу rake или новый поток с контроллера?

У меня есть класс (/lib/updater.rb), который выполняет большое обновление базы данных (вызов внешнего сервера, расчеты и т. д.). Обычно эта задача вызывается cron сервера (rake /lib/tasks/launch_updater.rake, который запускает updater.rb), но я хотел бы дать возможность запускать ее вручную и с клиента.

В этот момент из клиента пользователь может нажать кнопку и запустить его следующим образом:

# the controller
Thread.new {
  Updater.start
}

Это хорошее решение или лучше запускать прямо из задачи грабли?

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

Задача не должна блокировать (пользователь должен нормально перемещаться по приложению, не дожидаясь окончания задачи).

Что лучше и почему?


person damoiser    schedule 29.08.2013    source источник
comment
Вы можете сделать это, используя гем отложенной работы. Взгляните на этот github.com/collectiveidea/delayed_job.   -  person Arun    schedule 29.08.2013
comment
+1 @Arun, спасибо, это хорошая альтернатива, но что вы думаете о моих двух решениях?   -  person damoiser    schedule 29.08.2013
comment
ИМХО, тред не лучшая идея. Выполнение этого в качестве фоновой работы лучше всего соответствует вашим требованиям. Вызов задачи rake в контроллере — плохая практика.   -  person Arun    schedule 29.08.2013
comment
Мы сделали что-то вроде (псевдокод) system("bundle exec rake ... --trace >> logfile 2>&1 &") в контроллере, когда фоновое задание было просто невозможно. Это послужило нам хорошо. Вспомнил, что получил это от railscast.   -  person Ivo Dancet    schedule 21.09.2013


Ответы (1)


Немного поработав над своим вопросом, я нашел следующие заметки:

  • при использовании потока используемый ЦП совпадает с ЦП приложения (даже если у вас многоядерный сервер, ЦП тот же). Если вы хотите использовать Thread, задача Thread не должна быть «тяжелой», иначе вы можете столкнуться с проблемами ЦП (медленная обработка приложения).
  • когда вы запускаете задачу Rake из терминала или из cron сервера, это должно занимать процессор с более легким запущенным процессом. Но если вы запускаете задачу из приложения, я думаю, что процессор даже здесь такой же, как и в приложении.
  • the better solution to work with heavy charge task is to use a delayed service, in this manner the job task should take another CPU than the app's CPU without make problems at the performance of the app:
person damoiser    schedule 08.12.2013