2022/07/07 今回の気になった bugs.ruby のチケット
今週は Ractor.make_shareable(obj) 時に obj.make_shareable を呼び出せるようにする提案がありました。
[Bug #18896] Shellwords.escape(nil) returns "empty" string
require 'shellwords' pattern = 'Jan 15' puts "grep #{Shellwords.escape(pattern)} file" # => grep Jan\ 15 file
- このモジュールに対して
Shellwords.escape(nil)を渡すと空の文字列が返ってくるがこれが意図していないのではないかというバグ報告- 例外を出すのが意図しているとのこと
require "shellwords" puts Shellwords.escape(nil) # => "''"
- このライブラリしらなかった
[Feature #18894] Object#make_shareable
Marshal.dump(obj)がobj.marshal_dumpを呼び出すようにRactor.make_shareable(obj)を呼び出した時にobj.make_shareableが呼び出されるようにする提案objごとに固有のmake_shareableを実装する必要がある時は便利そう?- 例えば『
Resolv::Hostsの場合は遅延して初期化を行っているので Ractor では利用できない』とコメントされていますね- なので
make_shareableないで事前にロードする仕組みが必要
- なので
- 例えば『
- ちなみに
Ractor.make_shareableは任意のオブジェクトをRactor間でやりとりできるようにするための仕組み- 基本的に
Ractorでオブジェクトを扱う場合は不変である必要がある - 参照: 【Ruby 3.0 Advent Calendar 2020】Ractor の共有可能オブジェクトについて【24日目】 - Secret Garden(Instrumental)
- 基本的に
obj = [1, 2, "hoge"] # 共有可能オブジェクトではない p Ractor.shareable? obj # => false # Ractor.make_shareable(obj) を呼び出すと obj を Ractor で利用できるようにする # これは結果的に全てのオブジェクトが freeze されることになる Ractor.make_shareable(obj) p Ractor.shareable? obj # => true p obj.frozen? # => true p obj[2].frozen? # => true