Новый экземпляр sinatra запускается при каждом запросе? - PullRequest
9 голосов
/ 27 ноября 2011

Когда поступает новый http-запрос, будет ли запущен новый экземпляр sinatra, например, будет ли инициализироваться sinatra, или будет вызван просто метод предыдущего экземпляра (соответствующий метод get / post / route) sinatra?Спасибо за любые ссылки на документацию, я не смог их найти.

Было бы также интересно, если это поведение зависит от типа развертывания - WEBrick / Passenger и т. Д.

Ответы [ 4 ]

13 голосов
/ 02 декабря 2011

Новый класс создается для каждого запроса. Тем не менее, это не сделано Rack. Это особенность Синатры. Если вы хотите углубиться в детали: экземпляр на самом деле не создается с Sinatra::Application.new, но с Sinatra::Application.prototype.dup, см. Sinatra::Base#call для кода.

2 голосов
/ 07 декабря 2011

Вы должны всегда предполагать, что все приложение может быть перезагружено под вашими промежуточными запросами. Что, если у вас запущено 16 копий вашего приложения - запрос от пользователя 'jane' для '/' может появиться в копии # 2, тогда, когда она заходит в '/ signup', запрос достигнет # 12 (возможно, загружается для этого событие) приложение. Поэтому не имеет значения, что делает Sinatra (хотя похоже, что они делают что-то похожее), поскольку ваше приложение может появиться где угодно, загружаться сегодня, вчера или мс назад.

Если вы планируете расти - или зависеть от Heroku и т. Д. - ваше приложение должно работать нормально, используя «дробовик», который перезапускает все для каждого запроса. Я полагаю, если ваше приложение делает что-то радикально отличное от обслуживания веб-страниц и почти никогда не падает или не перезагружается, вы можете избежать «НЕТ»

Таким образом, мой ответ «ДА» (но не всегда, и даже не всегда обычно).

Тем не менее, удобно знать, как все работает, так что, возможно, вы можете настроить только некоторую сложную схему кэширования вычисленных активов один раз для каждой загрузки приложения, что является опцией производительности. Например, если при каждом обращении к вашему приложению с URL-адресом / calc_pi? Decimals = 2000 всегда получается одно и то же 2000-значное число, вы можете кэшировать его в каждом экземпляре.

0 голосов
/ 28 ноября 2011

Запустите это, вы будете знать все, но это не означает, что механизм Rack работает как Sinatra. (На самом деле, Rack будет создавать новый экземпляр для каждого запроса)

require 'sinatra'

configure do
    set :number, 0
end

number = 0

get '/test1' do
    var = "The number is #{number}"
    number = number + 1
    var
end

get '/test2' do
    var = "The number is #{settings.number}"
    set :number, settings.number + 1
    var
end
0 голосов
/ 27 ноября 2011

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

require 'sinatra'

flag = false

get '/stuff' do
  puts "flag is #{flag ? 'set' : 'unset'}"
  flag = true
end

Когда этот код выполняется и два запроса получены, сервер запросит flag is unset а затем flag is unset.

РЕДАКТИРОВАТЬ:

Это показывает, что файлы не перезагружаются.Используя puts self.object_id, self.class (как рекомендовано pguardiario), мы фактически видим, что для каждого запроса создается новый экземпляр Sinatra::Application.

...