🐈

[Feature #21028] Ractor の共有可能オブジェクトでないオブジェクトが調べられる機能を追加する提案

2025/01/20に公開

[Feature #21028] Method for finding why an object isn't Ractor shareable

  • Ractor.shareable? で Ractor 間で参照できるオブジェクトかどうかを判定することができる
    • Ractor では frozen だと『Ractor 間で参照できるオブジェクト』として判定される1
# freeze されている場合は true を返す
obj1 = { a: 1, b: 2 }.freeze
pp Ractor.shareable?(obj1) # => true

# そうでない場合は false になる
obj2 = [1, 2, 3]
pp Ractor.shareable?(obj2) # => false
  • この時にすべてのネストしたオブジェクトが frozen である必要がある
  • なので次のような場合は false が返ってくる
# [1, 2, 3] は frozen ではないので false が返ってくる
obj = { c: 3, d: [1, 2, 3] }.freeze
pp Ractor.shareable?(obj) # => false

# [1, 2, 3] も freeze すれば true になる
obj = { c: 3, d: [1, 2, 3].freeze }.freeze
pp Ractor.shareable?(obj) # => true
  • このような時に Ractor.shareable? で『どのオブジェクトが参照可能でないか( frozen でないか)』を判定できるようにしたいチケットになる
  • このチケットでは Ractor.shareable? にブロック引数を追加し、以下のように受け取れるようにする提案がされている
Ractor.shareable?(obj) { |not_shareable_obj| }
  • 便利そうなのかな?とお持ちつ Ractor.shareable? の責務なのかと言われるとちょい微妙な気もする
  • 逆に Ractor.make_sharedable で『共有可能オブジェクト』でない場合はブロックを呼び出すとかだとよかったりしないかなー
# 共有可能オブジェクトでない場合はどう共有可能オブジェクト化するのか制御できる
Ractor.make_sharedable(obj) { |not_shareable_obj| not_shareable_obj.freeze }
GitHubで編集を提案

Discussion