Выполнить код после того, как страница отрисована пользователю (Синатра)

Я ищу способ запустить некоторый медленный код после того, как страница отображается для пользователя. Конкретно, я хотел бы иметь возможность сделать что-то вроде этого:

get '/fast-action' do
  compute_after_render { put some slow code here }
  'request successful'
end

Я думал о вставке информации о вычислениях в базу данных. А затем запустить что-то вроде планировщика rufus, который будет проверять, есть ли что-то, что нужно вычислять раз в минуту.
Но я бы не хотел, чтобы пользователь ждал, пока база данных завершит вставку.

Есть ли способ заставить Sinatra запускать какой-то код после того, как страница отображается для пользователя?

3 ответа

Да, один быстрый и простой способ - начать новую тему:

get '/fast-action' do
  body 'request successful'
  Thread.new{ slow code }
end

Вы можете использовать потоковые ответы:

get '/fast-action' do
  stream do |out|
    out << 'request successful'
    put some slow code here
    out << " "
  end
end

Имейте в виду, однако, что поток сервера будет заблокирован на время этого запроса (и, конечно, выполнение медленного кода).

Я предлагаю вам изучить побочные работы. Мне нравится использовать драгоценный камень Sidekiq для этого. Он использует Redis для хранения заданий, которые необходимо запустить, и проверяет его время от времени. Это полностью настраивается и все такое. Я настоятельно рекомендую его, если вы выполняете задания, которые можно выполнить позже, например, отправку электронной почты, обработку изображений и т. Д., А также выполнение длинных процессов.

Другие вопросы по тегам