Rack是否串行或同时处理请求?

时间:2013-03-20 06:57:43

标签: ruby rack thin unicorn

假设我有一个进程Rack应用程序,如果多个请求同时到达,call(env)的调用是否同时发生?或者是否保证call(env)会连续发生,因此@counter上没有竞争条件?使用Unicorn或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

1 个答案:

答案 0 :(得分:0)

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

  

Is Sinatra multi threaded?

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