Slide 1

Slide 1 text

Ractorが出たから Rubyの並列処理をおさらいする 2021/02/24 @第28回ゆるはち.it 株式会社スマートアルゴリズム 齋藤 和也

Slide 2

Slide 2 text

自己紹介 名前:齋藤 和也 HN:mokichi 年齢:33歳 居住:東京都 出身:福岡県 🍜 Twitter:@mokichi_s12m 株式会社スマートアルゴリズム 代表取締役 株式会社Vook 外部CTO クラウドインフラを含むサーバサイド開発やDevOps が得意 ここ数年は Elixir/Phoenix にお熱 🔥 (ビルディット社との付き合いは結構長い )

Slide 3

Slide 3 text

Ruby3.0で Ractor が追加されました 🎉 まだ experimental

Slide 4

Slide 4 text

Ractorとは ● アクターモデル風の並行・並列制御機構 ● 並列実行単位をRactorと呼んでいる Ractor.new{ expr } ● メッセージの送受信でRactor間のコミュニケーション ● 各Ractorに少なくとも1つのスレッドがある ● コントリビューター曰く「らくたー」と読むのが正しそうです (当初あーるあくたーと読んでいたのは内緒) https://www.youtube.com/watch?v=40t8EPpnujg

Slide 5

Slide 5 text

プロセスやスレッドじゃダメなの? 🤔

Slide 6

Slide 6 text

プロセスの問題点 ● OSへの負荷がスレッドと比較して高い ● メモリをたくさん使う (COWがあったとしても) ● プロセス間でメモリ上のオブジェクトを直接共有する ことができず、別の手段でやりとりする必要がある

Slide 7

Slide 7 text

スレッドの問題点 ● スレッド間でメモリを共有するため、複数スレッドから同じオブ ジェクトを同時に操作するとまずいことに (Mutex等使えば解消できるが、かなり気を使う) ● 処理どうしに依存関係があると複雑さが増す ● CRubyにはGIL(GVL)があるためスレッド安全ではあるが、マ ルチコアを活用できない

Slide 8

Slide 8 text

GILについて ● Global Interpreter Lock の略 RubyではGVL(Giant VM Lock)という名称 ● 同時に実行されるスレッドは常に1つ ● I/Oの待機時には解放される ○ WebアプリケーションのようにI/Oが処理の大部分を占めるものは マルチスレッドによる並列化の恩恵を受けられる

Slide 9

Slide 9 text

人類には マルチスレッドプログラミングは 難しすぎる 🤯 C++やJavaでは結構やってましたが… (お察し)

Slide 10

Slide 10 text

Ractorの特徴 ● 異なるRactorではGILの影響を受けない ● ミュータブルな変数をRactor間で共有できない ○ ディープコピーを渡す or 所有権を移動させる ● 別Ractorからのメッセージを待つことができるため、 依存関係がある処理やワーカープールを記述しやすい ○ スレッドで同じことしようとすると、ロックが複雑に絡み合う

Slide 11

Slide 11 text

時間があればサンプルを少し見る

Slide 12

Slide 12 text

将来Ractorはこう使われる?(勝手な想像です) ● Unicorn/Puma や Resque/Sidekiq の発展型 ○ GILの影響を受けないことによる恩恵を受けられる ● 機械学習 (データ収集 > 前処理 > 学習 > 予測 の全工程) ○ Ruby自体も処理速度が向上しているし、ライブラリも結構あるみたい ○ RubyでWebアプリ作ってるのに、そこだけわざわざPython使うのは… ● 分散コンピューティング ○ PubSubとうまく使えば別マシンのプロセスと連動できたり?

Slide 13

Slide 13 text

We ❤ Ruby!