Ruby / Rails如何决定何时应该杀死Thread.current?

时间:2016-03-24 22:34:55

标签: ruby-on-rails ruby multithreading

我多次听过这个评论并理解在重新使用之前杀死本地线程的重要性:

“如果你的框架重用线程,那么不清理线程本地可能是个问题”。

在下面的示例中,可以直接判断何时应该杀死本地线程:

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如何确定何时杀死本地线程。

1 个答案:

答案 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的实例。并替换它们。