我正在创建一个非常简单的基于Rack的应用程序,因为我希望它能够完成一项非常具体的任务。
server.rb
看起来像这样:
Path= File.expand_path("#{File.dirname __FILE__}/../../")
require "bundler/setup"
require "thin"
require "rack"
%w(parser auth controller).each do |file|
require "#{Path}/app/server/#{file}.rb"
end
builder = Rack::Builder.app do
use Auth
run Parser.new
end
Rack::Handler::Thin.run(builder, :Port => 8080, :threaded => true)
parser.rb
看起来像:
class Parser
def initialize
@controller = Controller.new
end
def call(env)
req = Rack::Request.new(env).params
res = Rack::Response.new
res['Content-Type'] = "text/plain"
command= req[:command]
if command =~ /\A(register|r|subscribe|s)\z/i
@controller.register
end
res.write command
res.finish
end
end
现在我的问题,从设计角度来看,最好是创建一个Controller
实例并将其与每个请求一起使用(如上面代码的Idid),或者为每个请求创建新的控制器实例(将@controller.register
更改为Controller.new.register
)?哪个更好用,为什么?
提前致谢
答案 0 :(得分:1)
每个请求创建一个新控制器的开销可能不会那么大。
如果将状态存储在控制器(实例变量等)中并重用它,则可能会遇到并发问题,例如竞争条件或加载时死锁。
如果您注意确保Controller对象不存储任何状态,则可以重复使用它。如果每个请求执行任何类型的状态存储,则需要确保共享资源是属性同步的。
我的2c - 为每个请求创建一个新控制器,直到您可以确认每次请求创建一个新控制器时性能受到影响。它更简单,更清洁,更不容易出现奇怪的错误。