我有一个名为 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/