我多次听过这个评论并理解在重新使用之前杀死本地线程的重要性:
“如果你的框架重用线程,那么不清理线程本地可能是个问题”。
在下面的示例中,可以直接判断何时应该杀死本地线程:
def do_with_current_user
Thread.current[:current_user] = self.current_user
begin
yield
ensure
Thread.current[:current_user] = nil
end
end
在Rails调试器中,我看到Thread.current
在一些操作和加载模型/路由后保持活动状态(应用程序中没有线程本地查杀机制)。我的问题是Ruby / Rails如何确定何时杀死本地线程。
答案 0 :(得分:1)
我认为问题是Rails没有确定何时杀死线程局部变量,所以如果你没有像这样的代码来自动删除它们,你可能会遇到严重的混乱。我尽可能地远离他们,但有些情况下他们无法避免。
在这些情况下,请避免留下任何痕迹。线程局部变量部门中的杂乱可能会导致巨大的麻烦,因为这些对象不能被垃圾收集。
您的代码也可以简化:
def do_with_current_user
Thread.current[:current_user] = self.current_user
yield
ensure
Thread.current[:current_user] = nil
end
您可能还想介绍一个包装器:
def current_user_local
Thread.current[:current_user] || self.current_user
end
在你的代码中,你使用线程局部变量并不明显,如果你改变了对存储信息的看法,你就不必去追踪Thread.current
的实例。并替换它们。