Rails использует ActiveJob , которые позволяют ставить в очередь дорогостоящие задачи и запускать их в фоновом режиме.Они довольно просты в использовании.
Кулак, вы можете использовать генератор рельсов для его создания:
rails generate job slow_algorithm
..., который создаст задание в app/jobs/slow_algorithm_job.rb
.Там вы можете реализовать свою логику алгоритма.
Поставить в очередь задачу так же просто, просто сделайте это в своем контроллере:
SlowAlgorithmJob.perform_later
Последнее, что вам нужно охватить, это настройка очередейбэкэнд, который на самом деле будет запускать задания.Rails поддерживает пару из них.Вероятно, самый простой для установки это delayed_job , но если вы ищете что-то более масштабируемое, я бы рекомендовал изучить Sidekiq .
РЕДАКТИРОВАТЬ: Как уведомить пользователя о том, что работа выполнена?
Чтобы сделать это, вам необходимо каким-то образом отслеживать ход выполнения задачи.Одним из возможных направлений является создание записи, назовем ее Task
, которая представляет один вызов вашего алгоритма.
Когда пользователь запускает действие, которое должно поставить задачу в очередь, запись задачи создается со статусом pending
, затем before_perform
и after_perform
могут быть использованы для перемещения статуса Task
в running
, а затем в completed
.
after_perform
можно использовать хук для уведомленияпокупатель.Как приложение собирается это сделать, зависит от вас.Например, Dropbox использует аналогичную систему при загрузке большого количества файлов.Они ставят в очередь задание, архивируют файлы, а затем отправляют электронное письмо со ссылкой для скачивания после завершения задания.
Другой подход - использование системы уведомлений в приложении.
Наконец,чтобы всплывающее уведомление не требовало от пользователя обновления страницы, вам нужно будет использовать ActiveCable
и снова отправить уведомление пользователю, используя after_perform
hook.