2013-03-20 91 views
0

假设我有一个单一的过程Rack应用,如果多个请求在同一时间可以到达的call(env)的调用同时发生?或者保证call(env)会连续发生,因此@counter没有竞赛状况?使用独角兽还是Thin有什么区别?机架可以串行处理还是同时处理请求?

require 'json' 

class Greeter 
    def call(env) 
    req = Rack::Request.new(env) 
    @counter ||= 0 
    @counter = @counter + 1 
    puts @counter 
    [200, {"Content-Type" => "application/json"}, [{x:"Hello World!"}.to_json]] 
    end 
end 

run Greeter.new 

回答

0

这取决于您的Rack处理程序(应用程序服务器)。独角兽和瘦都可以并发请求,使用多进程和/或偶数模式,具体取决于您选择哪一个以及如何配置它。所以它不是Rack支持它的问题,因为它是负责并发的处理器(Unicorn,Thin或其他)。这篇文章有一些更多的细节和几个流行的机架式应用服务器的概述:

Is Sinatra multi threaded?

如果你想知道是否在Greeter类的一个实例变量可能在线程之间共享,即即使使用其中一个并发应用程序服务器也不应该发生,因为它们每个都有自己的Greeter实例,因此也是单独的实例变量。但是,你会需要需要提防的全局变量或常量,因为这些会在所有线程共享,所以你就需要考虑到这一点,并使用锁/互斥等