在请求期间设置Time.zone:线程安全吗?

Tyl*_*non 11 singleton ruby-on-rails thread-safety ruby-on-rails-3.2

我想让我的应用用户指定一个时区,然后在每个请求的开头设置他们的时区.在Rails,AFAICT中,这是通过设置单例对象来完成的:

Time.zone = "America/Los_Angeles"
Run Code Online (Sandbox Code Playgroud)

我对最佳实践的理解是,一般来说,应该将单例设置为ONCE.例如,在应用程序配置中.

从类似问题的答案,有人建议在ApplicationController中设置它

class ApplicationController < ActionController::Base
  before_filter :set_timezone
  def set_timezone
    # current_user.time_zone #=> 'London'
    Time.zone = current_user.time_zone if current_user && current_user.time_zone
  end
end
Run Code Online (Sandbox Code Playgroud)

这样安全吗?或者我冒一个线程影响另一个线程的风险?我将尝试对此进行测试,但这不是最简单的测试场景,所以我想我应该看看是否有人已经这样做了.

Fre*_*ung 18

如果查看实现它的代码,您可以看到当前区域存储在线程局部变量中,因此每个线程都可以设置Time.zone而不会干扰其他线程.