2

私はセルロイドに非常に慣れていませんが、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

ロケールを変更すると、先物はデフォルトのロケールを考慮し続けます:it

基本的なものが欠けているような気がします...

4

2 に答える 2

2

セルロイドの先物は別のスレッドプールで実行されます(一部の回答が示唆する別のプロセスではありません)。

I18n.locale値は、個々のスレッドhttp://www.rubydoc.info/docs/rails/2.3.8/I18n%2FConfig%3Alocaleをスコープとする変数に格納されます。

グローバルではなく、スレッドにスコープされる唯一の構成値は :locale です。デフォルトは default_locale です。

つまり、ワーカー スレッドの外部で設定した構成は、ワーカー スレッド内では適用されません。

必要がある:

  1. I18n.default_locale構成をプロセス内のすべてのワーカー スレッドに伝達する場合に使用するか、または
  2. ロケールをパラメーターとして未来に送信し、設定します (必ずブロックで再度クリアしてください。そうしないと、他のセルロイド アクターでおかしなことが起こる可能性があります)
于 2016-04-15T09:15:56.747 に答える
0

ロケールを使用する場合は、引数としてコンストラクターに渡します。

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

ブロックは新しいプロセスで実行されるため、ロケール情報が失われると思います。

于 2016-04-15T08:59:52.007 に答える