当有新的http请求进来时,是否会启动一个新的sinatra实例,例如是否需要初始化sinatra,还是只调用先前实例(对应的get/post方法/路由)?
谢谢提供文档链接,我找不到任何相关资料。
同时,这种行为是否取决于部署类型 - WEBrick/Passenger等也很有趣。
谢谢提供文档链接,我找不到任何相关资料。
同时,这种行为是否取决于部署类型 - WEBrick/Passenger等也很有趣。
每个请求都会创建一个新的类。然而,这不是由Rack完成的,这是Sinatra的一个特性。如果您想深入了解细节:实例实际上并不是使用Sinatra::Application.new
创建的,而是使用Sinatra::Application.prototype.dup
创建的,请参阅Sinatra::Base#call
中的代码。
require 'sinatra'
flag = false
get '/stuff' do
puts "flag is #{flag ? 'set' : 'unset'}"
flag = true
end
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
require
或load
来完成,而后者则是TheClass.new
。 - miaout17