Как разделить значение переменной между запросами в Rails? - PullRequest
0 голосов
/ 06 февраля 2019

Я использую Ruby on Rails 4.2.В контроллере у меня есть метод, который занял много времени, чтобы выполнить тяжелые вычисления.Я хочу проинформировать пользователя о ходе расчетов.Моя идея состояла в том, чтобы иметь переменную @progress, которая обновляется во время вычислений и читается различными действиями, обрабатывающими запросы AJAX из внешнего интерфейса.Но эта идея не удалась - у меня всегда есть значение по умолчанию 0 в действии AJAX, пока переменная обновляется в длинном методе.Я пробовал @@ progress, $ progress и session [: progress], но с точно такими же результатами.Сейчас я собираюсь создать модель для сохранения прогресса в базе данных и чтения его оттуда, но я не могу поверить, что это не может быть сделано более простыми средствами.Пожалуйста, поделитесь своими мыслями!

1 Ответ

0 голосов
/ 06 февраля 2019

Теоретический:

Обычный подход для этих случаев - асинхронное выполнение задания из процесса обработчика HTTP (поэтому конечный пользователь не слишком долго ожидает ответа отвеб-сервер).

Это означает:

  1. делегировать тяжелую работу фоновому заданию,
  2. как-то информировать клиентскую часть о том, когда работа выполнена(2 варианта здесь).

Практический (применение теоретического выше в контексте приложения Rails):

  1. Фоновое задание: сообщество rails предоставляет широкий спектр гемов (+ встроенное решение ActiveJob) для выполнения асинхронных заданий (= фоновые задачи).Их можно разделить на 2 основные категории:

    • сохраняется состояние: DelayedJob, Que и т. Д. (Сохраняет очередь в файловой системе, очередь может быть возобновленаесли сервер перезагружается)
    • в памяти состояние: Resque, Sidekiq и т. д. (обычно быстрее, но очередь теряется при перезагрузке сервера)
  2. поверхность на стороне клиента: здесь есть два основных варианта:

    • опрос : вызов AJAX на стороне клиента на сервер каждый Xсекунд, чтобы проверить, выполнено ли фоновое задание
    • подписка через веб-сокет: подключение на стороне клиента через веб-сокет к серверу и прослушивание события, инициированного, когда задание выполнено (например:ActionCable, как указано @Vasilisa)

На основе мнений:

Если вы хотите сохранить простоту,Я хотел бы пойти с очень простой реализацией: Resque для серверной части и системой опроса для интерфейса.

Если вы хотите что-то законченное, заглушитеВ состоянии сопротивляться перезагрузкам сервера и восстановлению очереди, где она была до сбоя, я бы использовал постоянную версию (например, DelayedJob) или обернул решение в памяти своей собственной сохраняющейся логикой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...