I18n.with_locale线程安全吗?

时间:2015-07-27 09:12:22

标签: ruby-on-rails thread-safety rails-i18n

我创建了一个功能,可以使用页面创建者的语言发布新闻。

以下是创建新闻的代码:

def add_news
  locale = creator.language.blank? ? I18n.locale : creator.language
  I18n.with_locale(locale) do
    title = I18n.t('news.subject')
  end
  create_news({title: title})
end

它运作良好,新闻是用良好的语言创造的。但有时候会使用错误的语言。我已经阅读了i18n(https://github.com/svenfuchs/i18n/blob/master/lib/i18n.rb)的源代码,对我来说, with_local 函数不是线程安全的。我很惊讶,因为我没有读过关于那个问题的帖子。

那么,你觉得呢?线程安全与否?如果是这样,你知道其他解决方案吗?

谢谢,br,

埃里克

2 个答案:

答案 0 :(得分:2)

看起来它来自Ruby on Rails guides,因为它使用的是Thread.current。

还进行了一项小型(结论性)实验:

n = I18n.available_locales.length
10.times do |i|
  loc = I18n.available_locales[i % n]
  Thread.new do
    I18n.with_locale(loc) do
      puts "#{loc} #{I18n.t 'one.of.your.keys'}"
    end
  end
end

答案 1 :(得分:0)

Thread.current对于线程Web服务器(例如Puma或Thin)不是线程安全的。有关更多详细说明,请参见github.com/steveklabnik/request_store。