💬

[Feature #20715] Ractor ローカルな値を参照する Ractor.[] / Ractor.[]= を追加する提案

2024/10/27に公開

[Feature #20715] Ractor.[] and Ractor.[]= to access Ractor local storage

  • Ractor ローカルな値を参照する Ractor.[] / Ractor.[]= を追加する提案
  • 現状でも Ractor#[] / Ractor#[]= が存在しているんですがこれも Ractor ローカルな値を参照しているので実際には Ractor のインスタンスオブジェクトには依存していないみたいですね
p Ractor.current   # => #<Ractor:#1 running>
Ractor.current[:foo] = 42

Ractor.new{
  # トップレベルの Ractor.current と同じオブジェクトを返す
  p Ractor.main   # => #<Ractor:#1 running>

  # ただし、トップレベルで保存した値は参照されない
  p Ractor.main[:foo]   # => nil
}.take
  • なので Ractor.current を経由して参照するよりも Ractor.[] / Ractor.[]= で参照するほうが効率がよいとのこと
  • これは開発版の Ruby 3.4-dev ですでに対応済です
# Ractor[]= で値を割り当てて
Ractor[:foo] = 42

Ractor.new{
  Ractor[:foo] = "other"
  p Ractor[:foo]   # => "other"
}.take

# Ractor[] で参照できる
# この値は他の Ractor 内での値は反映されない
p Ractor[:foo]   # => 42
GitHubで編集を提案

Discussion