为什么Rails中Application Controller的类变量在不同的请求中重新初始化

ywe*_*nbo 7 ruby-on-rails

我的应用程序控制器名为McController,它扩展了ApplicationController,我在McController中设置了一个名为@@ scheduler_map的类变量,如下所示:

class McController < ApplicationController
  @@scheduler_map = {}
  def action
    ...
  end
  private
  def get_scheduler(host, port)
    scheduler = @@scheduler_map[host+"_"+port]
    unless scheduler
      scheduler = Scheduler.create(host, port)
      @@scheduler_map[host+"_"+port] = scheduler
    end
    scheduler
  end
end
Run Code Online (Sandbox Code Playgroud)

但我发现从第二个请求开始@@ scheduler_map始终是一个空哈希,我在开发环境中运行它,有人知道原因吗?那与运行环境有关吗?

先感谢您.

Dan*_*tra 9

你是在自问自答 :-)

是的,这是由开发环境(我测试过)引起的,更准确地说是config/environments/development.rb中的配置选项"config.cache_classes = false"

此标志将导致在每个请求时重新加载所有类.这样做是因为当您对控制器进行少量更改时,您不必重新启动整个服务器.

您可能想要考虑到您正在尝试的内容在以后在生产中进行大量访问时会导致巨大的内存泄漏.每次用户访问您的网站时,它都会在该哈希中创建一个新的主菜,并且永远不会被清除.想象一下,如果10.000用户访问过您的网站会发生什么?或者1.000.000怎么样?所有这些数据都保存在系统内存中,因此服务器上线时间越长,占用的空间就越大.

此外,我不确定此解决方案是否适用于生产服务器.服务器将创建多个威胁,以同时处理大量访问者.我认为(不确定)每个威胁都有自己的类实例.这意味着在处理1中可能存在ip xx的调度映射,但在处理2中则不存在.如果你给我一些关于这个调度程序的更多信息,我可以给出一个不同解决方案的建议.