У меня есть класс (/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
Задача не должна блокировать (пользователь должен нормально перемещаться по приложению, не дожидаясь окончания задачи).
Что лучше и почему?
system("bundle exec rake ... --trace >> logfile 2>&1 &")
в контроллере, когда фоновое задание было просто невозможно. Это послужило нам хорошо. Вспомнил, что получил это от railscast. - person Ivo Dancet   schedule 21.09.2013