- Ruby 4.0 の Ractor 使ってみた (1) 触ってみるまで
- Ruby 4.0 の Ractor 使ってみた (2) 題材
- Ruby 4.0 の Ractor 使ってみた (3) Ractor::Port に馴染む
- Ruby 4.0 の Ractor 使ってみた (4) Ractor に馴染む
- Ruby 4.0 の Ractor 使ってみた (5) 設計方針
- Ruby 4.0 の Ractor 使ってみた (6) 実装
- Ruby 4.0 の Ractor 使ってみた (7) ベンチマークテスト
はじめに
並列処理の何たるかを理解していない筆者が Ruby 4.0 の Ractor を使ってみた。
何回かに分けて,その足跡を記事にしていく。
ただ,筆者の力不足で「そもそも Ractor とは何か」といった解説はできない。
とりあえず「複数の CPU に別々の Ractor とやらを割り当て,同時に仕事をさせたら早く終わるんじゃね?」という仕組みなのだろう(?)くらいに思っている。
しかし,分かる範囲で解説を加え,筆者と同じような人の参考になるよう心がける。
Ruby 3.0 の Ractor
Ruby 3.0(2020 年リリース)で Ractor が導入されたとき,私には非常に難しく感じられた。
その原因は以下のようなことだったと思う。
- Ractor の解説がスレッドなどの概念に親しんでいることを前提としていた
- Ractor は並列処理の最下層(?)の仕組みであり,それをどう組み合わせて使うかは多くのやり方がある
- 実験して理解しようとしても,非同期なので,再現性が低いことがある
そして,サンプルコードを見ながら,過去に作ったいくつかのスクリプトの Ractor 化を試みたが,たいへん苦労したし,そもそもできなかったりした。
そして,結果はというと,実行時間が減ったものもあれば,かえって遅くなったものもあった。
遅くなった(あるいは期待したほど速くならなかった)原因は,Ractor をよく理解せずに使ったこともあろうし,当時の Ractor の性能もあっただろう。
その後,Ractor に地道な改良が加えられて性能が上がったようだったが,すっかり意気消沈して Ractor から遠ざかってしまった。
Ruby 4.0 の Ractor
Ruby 4.0 で Ractor の API が大幅に刷新された。もともと「実験的」機能だったこともあり,互換性を失う変更が断行された。
これを機に再び触ってみようと思った。
第一級の資料は
Ractor::Port ― Ractor の API を一新した話
だと思うが,これはやはり私には難しく,最後までは読めなかった。
以下の理由で難しかったのだと思う。
- 素人が「とりあえず試してみる」ための解説ではない
- Ruby 3.0 の Ractor を理解している前提で書かれている
- 他言語の並列処理の仕組みの理解も必要
次回はこの連載で扱う「Ractor で並列化したい処理」の題材を説明する。