【问题标题】:Does Rack handle requests serially or concurrently?Rack 是串行还是并行处理请求?
【发布时间】:2013-03-20 06:57:43
【问题描述】:

假设我有一个单进程 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

【问题讨论】:

    标签: ruby rack thin unicorn


    【解决方案1】:

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

    Is Sinatra multi threaded?

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

    【讨论】:

      猜你喜欢
      • 2012-12-18
      • 2016-07-25
      • 1970-01-01
      • 2015-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多