ruby-on-rails - 为什么 Rails 中应用程序 Controller 的类变量在不同的请求中重新初始化

标签 ruby-on-rails

我有一个名为 McController 的应用程序 Controller ,它扩展了 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

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

先感谢您。

最佳答案

你是在自问自答 :-)

是的,这是由开发环境引起的(我对其进行了测试),更准确地说是 config/environments/development.rb 中的配置选项“config.cache_classes = false”

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

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

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

关于ruby-on-rails - 为什么 Rails 中应用程序 Controller 的类变量在不同的请求中重新初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5105474/

相关文章:

ruby-on-rails - ruby rails : A way to save currency into a column within a database-table

ruby-on-rails - 精彩的 ActiveModel::ForbiddenAttributesError

ruby-on-rails - 在 Rails 中使用不显眼的 js 制作 Facebook Like 按钮

javascript - link_to 为 :method => :delete routing through GET not DELETE rails 4

ruby-on-rails - 为每个键值对打印散列 View 并换行

java - 单个页面上的 Websocket 数

ruby-on-rails - Ruby,Errno::EACCES,权限被拒绝,链轮

javascript - 让 jQuery 在 Rails 应用程序上运行

ruby-on-rails - 有没有办法检查 Ruby 变量是否包含二进制数据?

ruby-on-rails - 从字符串创建 URL(命名路由)