1

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

1 回答 1

1

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

Sinatra 是多线程的吗?

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

于 2013-03-20T07:19:57.027 回答