是每次请求都会启动一个新的sinatra实例



当一个新的http请求进来时,是否会启动一个新的sinatra实例,例如sinatra是否要初始化,或者只是调用sinatra先前实例的方法(相应的get/post方法/路由)?谢谢你提供的任何文档链接,我没有找到。

如果这种行为依赖于部署类型——WEBrick/Passenger等,那也会很有趣

为每个请求创建一个新类。然而,这是由Rack完成的不是。这是辛纳屈的特点。如果您想深入了解细节:实例实际上不是用Sinatra::Application.new创建的,而是用Sinatra::Application.prototype.dup创建的,请参阅Sinatra::Base#call获取代码。

你应该始终假设整个应用程序可以在你的中间请求下重新启动。如果你正在运行你的应用程序的16个副本-从用户'jane'请求'/'可以在拷贝#2,然后当她访问'/注册'的请求将达到#12(可能为这个事件启动)应用程序。所以它并不重要Sinatra做什么(虽然它看起来像他们做类似的事情),因为你的应用程序可能只是出现在任何地方,引导今天,昨天或一毫秒前。

如果你计划在Heroku等平台上进行扩展或部署,你的应用程序需要使用'shotgun'来正常运行,它会为每个请求重启所有内容。我猜如果你的应用程序做一些完全不同于服务网页,几乎没有崩溃或重新启动,你可能会逃脱'NO'

所以我的回答是"是"(但并不总是,甚至有时也不是通常)。

尽管如此,知道事情是如何工作的很方便,这样你就可以只设置一些复杂的计算资产缓存方案一次应用程序加载-这是一个性能选择。例如,如果每次调用你的应用程序与url/calculate_pi?Decimals =2000总是得到相同的2000位数字,您可以在每个实例上缓存它。

快速测试表明,无论请求是什么,同一个实例都在运行(至少在默认情况下是这样)。

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实例。

运行此程序,您将了解所有内容,但这并不意味着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

相关内容

最新更新