是不是每个请求都开始了一个新的sinatra实例?

时间:2011-11-26 21:12:22

标签: ruby sinatra passenger rack webrick

当有新的http请求进入时,会启动一个新的sinatra实例,例如有sinatra被初始化,或者只是被称为sinatra的前一个实例(相应的get / post方法/路线)的方法? 感谢您提供任何文档链接,我无法找到任何文档链接。

如果该行为取决于部署类型 - WEBrick / Passenger等

,那也很有趣

4 个答案:

答案 0 :(得分:13)

为每个请求创建一个新类。但是,这是由Rack完成的。这是Sinatra的一个特色。如果您想深入了解详细信息:实际上并未使用Sinatra::Application.new创建实例,而是使用Sinatra::Application.prototype.dup,请参阅Sinatra::Base#call了解代码。

答案 1 :(得分:2)

您应该始终假设整个应用程序可以在您之间的请求中重新启动。如果您运行16个应用程序副本,那么用户'jane'为'/'提出的请求可以在#2副本中进行,然后当她访问'/ signup'时,请求将达到#12(可能为此启动)事件)应用程序因此,Sinatra所做的事情并不重要(虽然看起来他们做了类似的事情),因为你的应用程序可以出现在任何地方,今天启动,昨天或几天前启动。

如果您计划成长 - 或者依赖Heroku等 - 您的应用程序需要使用'shotgun'正常运行 - 它会为每个请求重新启动所有内容。我想如果您的应用程序执行与提供网页完全不同的内容,并且几乎不会崩溃或重新启动,您可能会忘记“否”

所以我的答案是'是'(但并非总是如此,有时甚至通常都不会)。

然而,知道事情是如何工作的很方便,因此您可能只能在每个应用程序加载时设置一些复杂的计算资产缓存方案 - 这是一个性能选择。例如,如果使用url / calculate_pi?decimals = 2000对应用程序的每次调用始终产生相同的2000位数字,则可以在每个实例上缓存该数字。

答案 2 :(得分:0)

快速测试显示同一个实例正在运行任何请求(至少在默认情况下)。

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

答案 3 :(得分:0)

运行它,你会知道所有事情,但它并不意味着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