假设我有一个进程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
答案 0 :(得分:0)
这取决于您的Rack处理程序(应用程序服务器)。 Unicorn和Thin都能够使用多进程和/或偶数模型进行并发请求,具体取决于您选择的是哪种以及如何配置它。所以它不是Rack是否支持它的问题,因为它是负责并发的处理程序(Unicorn,Thin或其他)。这篇文章有一些更多细节和几个流行的Rack应用服务器的概述:
如果您想知道Greeter
类中的实例变量是否可能在线程之间共享,即使使用其中一个并发应用服务器也不会发生这种情况,因为它们每个都有自己的{{ 1}}实例,因此单独的实例变量。但是 需要注意全局或常量,因为这些将在所有线程中共享,因此您需要考虑这一点并使用锁/互斥锁等。