Выполнить код после того, как страница отрисована пользователю (Синатра)
Я ищу способ запустить некоторый медленный код после того, как страница отображается для пользователя. Конкретно, я хотел бы иметь возможность сделать что-то вроде этого:
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 для хранения заданий, которые необходимо запустить, и проверяет его время от времени. Это полностью настраивается и все такое. Я настоятельно рекомендую его, если вы выполняете задания, которые можно выполнить позже, например, отправку электронной почты, обработку изображений и т. Д., А также выполнение длинных процессов.