Ruby赛璐珞"environment"

Ruby Celluloid "environment"

我是 Celluloid 的新手,但我不明白为什么在我的 Rails 应用程序中,我的未来会失去当前的语言环境:

puts "locale OUTSIDE #{I18n.locale}"
data.map do |item|
  Celluloid::Future.new { puts "locale INSIDE #{I18n.locale}"; serialize_item(item) }
end.map(&:value)

基本上我得到了类似

的东西
locale OUTSIDE en
locale INSIDE it
locale INSIDE it
locale INSIDE it
locale INSIDE it
locale INSIDE itlocale INSIDE it
locale INSIDE it

locale INSIDE it

locale INSIDE it

当我更改语言环境时,futures 会继续考虑我的默认语言环境:它

我觉得我缺少一些基本的东西...

如果您想使用语言环境,请将其作为参数传递给构造函数:

Celluloid::Future.new(locale = I18n.locale) { puts "locale INSIDE #{locale}" }

我相信该块将在新进程中执行,因此您的区域设置信息会丢失。

Celluloid 期货在单独的线程池中执行(不是某些答案所建议的不同进程),

I18n.locale 值存储在单个线程范围内的变量中 http://www.rubydoc.info/docs/rails/2.3.8/I18n%2FConfig%3Alocale :

The only configuration value that is not global and scoped to thread is :locale. It defaults to the default_locale.

这意味着您在工作线程之外设置的配置不适用于工作线程。

您需要:

  1. 如果您希望将配置传播到进程中的所有工作线程,请使用 I18n.default_locale,或者
  2. 将语言环境作为参数发送到未来并进行设置(一定要在确保块中再次清除它,否则其他赛璐珞演员可能会发生有趣的事情)