2

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

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

# the controller 
Thread.new { 
    Updater.start 
} 

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

# 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

IMHO, Thread - не очень хорошая идея. Выполнение его в качестве фоновой работы лучше всего подходит для вашего требования. Вызов задачи рейка в контроллере - это плохая практика. – Arun

ответ

0

Работа немного на мой вопрос, я нашел следующие ноты:

  • при использовании тему, процессор используется одно и то же на ЦП приложения (даже если у вас есть многоядерный сервер с, CPU тот же). Если вы хотите использовать Thread, задача Thread не должна быть «тяжелой» или вы можете столкнуться с проблемами CPU (медленная обработка приложений).
  • Когда вы запускаете задачу Rake с терминала или с сервера cron, это должно занять процессор с более легким ходом процесса. Но если вы запускаете задачу из приложения, я думаю, что процессор даже здесь одинаковый для приложения.
  • лучшее решения для работы с тяжелой задачей заряда использовать замедленную службу, таким образом, задача работы должна занять другой процессор, чем центральный процессор приложения без создают проблемы при выполнении приложения:
Смежные вопросы