August 11, 2025

Ruby 3.5のRactorでyield/takeを復活させる

Ruby 3.5(現時点では3.5-dev)で並列実行機構であるRactorの仕様が大きく変わりましたRactor::Portという通信経路が定義され、別実行されるRactorの外から中への内向き通信経路がRactor#default_portでとりだせるRactor::Portで管理されるようになりました。従来からあるpush型の通信関数であるRactor#sendRactor.receiveもdefault_portと紐づけられています。

一方、pull型通信であるRactor.yieldRactor#take(3.4のドキュメントへのリンク)がなくなってしまいました。いちおうtakeは3.5でも残されているのですが、2025/8に除去します、と警告が表示され、また対になるyieldがないので並列実行途中(終了時ではなく)に出したメッセージを取得してくれません。

調べてみたところ、Ractor::Portの提案には3.5でも動くとされる代替策(Ractor.yield and Ractor#take with channel ractor)が記述されているのですが、これが実装ミスでうまく動きません。主な原因として、Ractorのインスタンス生成がinitializeを呼び出さずnewだけで定義されていることによるものと思われます。

そこでRactor.yieldとRactor#takeを3.5でも動くようにしてみました。newされるときに外向きの通信経路をRactor::Portで新たに追加してあげています。またRactor#monitorで終了を監視するようにしました。

上記で手元ではRuby 3.4までのコードをそのまま使うことができています。

08:56 fenrir が投稿 : 固定リンク | | このエントリーを含むはてなブックマーク | トラックバック
このエントリーのトラックバックURL: https://fenrir.naruoka.org/mt/mt-tb.cgi/964
コメント
コメントする









名前、アドレスを登録しますか?
(次回以降コメント入力が楽になります)
  • 匿名でのコメントは受け付けておりません。
  • 名前(ハンドル名可)とメールアドレスは必ず入力してください。
  • メールアドレスを表示されたくないときはURLも必ず記入してください。
  • コメント欄でHTMLタグは使用できません。
  • コメント本文に日本語(全角文字)がある程度多く含まれている必要があります。
  • コメント欄内のURLと思われる文字列は自動的にリンクに変換されます。