Ractorが出たからRubyの並列処理をおさらいする2021/02/24 @第28回ゆるはち.it株式会社スマートアルゴリズム 齋藤 和也
View Slide
自己紹介名前:齋藤 和也 HN:mokichi年齢:33歳居住:東京都 出身:福岡県 🍜Twitter:@mokichi_s12m株式会社スマートアルゴリズム 代表取締役株式会社Vook 外部CTOクラウドインフラを含むサーバサイド開発やDevOpsが得意ここ数年は Elixir/Phoenix にお熱 🔥(ビルディット社との付き合いは結構長い )
Ruby3.0で Ractor が追加されました 🎉まだ experimental
Ractorとは● アクターモデル風の並行・並列制御機構● 並列実行単位をRactorと呼んでいる Ractor.new{ expr }● メッセージの送受信でRactor間のコミュニケーション● 各Ractorに少なくとも1つのスレッドがある● コントリビューター曰く「らくたー」と読むのが正しそうです(当初あーるあくたーと読んでいたのは内緒)https://www.youtube.com/watch?v=40t8EPpnujg
プロセスやスレッドじゃダメなの? 🤔
プロセスの問題点● OSへの負荷がスレッドと比較して高い● メモリをたくさん使う (COWがあったとしても)● プロセス間でメモリ上のオブジェクトを直接共有することができず、別の手段でやりとりする必要がある
スレッドの問題点● スレッド間でメモリを共有するため、複数スレッドから同じオブジェクトを同時に操作するとまずいことに(Mutex等使えば解消できるが、かなり気を使う)● 処理どうしに依存関係があると複雑さが増す● CRubyにはGIL(GVL)があるためスレッド安全ではあるが、マルチコアを活用できない
GILについて● Global Interpreter Lock の略RubyではGVL(Giant VM Lock)という名称● 同時に実行されるスレッドは常に1つ● I/Oの待機時には解放される○ WebアプリケーションのようにI/Oが処理の大部分を占めるものはマルチスレッドによる並列化の恩恵を受けられる
人類にはマルチスレッドプログラミングは難しすぎる 🤯C++やJavaでは結構やってましたが… (お察し)
Ractorの特徴● 異なるRactorではGILの影響を受けない● ミュータブルな変数をRactor間で共有できない○ ディープコピーを渡す or 所有権を移動させる● 別Ractorからのメッセージを待つことができるため、依存関係がある処理やワーカープールを記述しやすい○ スレッドで同じことしようとすると、ロックが複雑に絡み合う
時間があればサンプルを少し見る
将来Ractorはこう使われる?(勝手な想像です)● Unicorn/Puma や Resque/Sidekiq の発展型○ GILの影響を受けないことによる恩恵を受けられる● 機械学習 (データ収集 > 前処理 > 学習 > 予測 の全工程)○ Ruby自体も処理速度が向上しているし、ライブラリも結構あるみたい○ RubyでWebアプリ作ってるのに、そこだけわざわざPython使うのは…● 分散コンピューティング○ PubSubとうまく使えば別マシンのプロセスと連動できたり?
We ❤ Ruby!