Ractor
真の並列処理です。
「Ractor」はCoddyKit上の無料Ruby Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはRuby Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Ruby Academyコースには全4レッスンが含まれています。
Ractorとは何ですか
Ractor(Ruby Actor)はRuby 3で導入された並行性の基本機構で、真の並列性を提供します。各Ractorは独立してRubyコードを実行するため、2つのRactorで2つのCPUコアを同時に使用できます。
- Ractorは可変オブジェクトを共有しないため、GVLの制約を回避できます。
- メッセージを送信して通信します。
Ractorはまだ実験的な機能なので、使用するとRubyは警告を表示します。
Ractorの作成
Ractor.newとブロックを使って作成します。ブロックは並列に実行されます。ブロックの最終的な値を取得するにはtakeを使います。
r = Ractor.new do
2 + 3
end
puts r.take共有状態を持たない
重要なルールは、Ractorは可変オブジェクトを自由に共有できないということです。Ractorのブロックは通常のブロックとは異なり、外側のローカル変数をキャプチャしません。データは明示的に渡す必要があります。
この分離により、ロックなしでも安全な並列実行が可能になります。
引数を渡す
Ractor.newの引数はブロックのパラメーターに渡されます。これがRactorに安全にデータを送る方法です。
r = Ractor.new(10) do |x|
x * x
end
puts r.takeメッセージの送信
Ractorにはメッセージ受信用のインボックスがあります。ractor.send(value)で送信し、ブロック内でRactor.receiveを使って受信します。
r = Ractor.new do
msg = Ractor.receive
"got: " + msg
end
r.send("hello")
puts r.takePushとPull
通信の方向は2つあります。
- Push:
sendでRactorに送り、Ractor.receiveで読み取ります。 - Pull:Ractorが
Ractor.yieldで値を渡し、外部側がtakeで読み取ります。
これらを組み合わせることで、Ractorでパイプラインを構成できます。
r = Ractor.new do
Ractor.yield 1
Ractor.yield 2
end
puts r.take
puts r.take凍結オブジェクトと共有可能オブジェクト
一部のオブジェクトは変更できないため、Ractor間で共有可能です。該当するのは、true、false、nil、数値、シンボル、そして完全に凍結されたオブジェクトです。
Ractor.make_shareableはオブジェクトグラフを凍結し、安全に共有できるようにします。
data = Ractor.make_shareable([1, 2, 3])
puts "Frozen? " + data.frozen?.to_sコピーと移動
共有できないオブジェクトを送信すると、Ractor はデフォルトでディープコピーを作成するため、それぞれが独自のオブジェクトを持てます。代わりに 移動することもできます。send(obj, move: true)を使うと所有権が移され、元のオブジェクトは使用できなくなります。
移動を使うと、大きなオブジェクトのコピーコストを避けられます。
並列処理
CPU負荷の高い処理を複数のRactorに分割し、結果を集めます。それぞれが独立して実行されるため、複数のコアを利用できます。
ractors = (1..3).map do |n|
Ractor.new(n) do |x|
x * 100
end
end
results = ractors.map(&:take)
puts "Results: " + results.join(", ")Ractorとスレッドの比較
比較すると、次のようになります。
- スレッドはメモリを共有するためロックが必要ですが、Ractorは分離されているためメッセージを使う必要があります。
- スレッドではRubyのCPU処理を並列化できませんが、Ractorでは並列化できます。
- Ractorはより厳格なため、多くの並行処理のバグを防げます。
その代わり、データ共有のルールがより厳格になります。
Ractorを使う場面
次のような場合はRactorを選びます。
- CPUバウンドな処理があり、1つのプロセスで複数のコアを使いたい場合。
- 共有状態によるバグを避けるため、分離性が必要な場合。
Ractorは実験的な機能であることに注意してください。APIは変更される可能性があり、多くのgemはまだRactorに対応していません。
理解度チェック
Ractorについての理解度を確認します。
まとめ:Ractor
Ractorを使ったプロセス内並列処理について学びました。
Ractor.newはコードを並列実行し、takeでその結果を取得します。- 引数または
sendでデータを渡し、Ractor.receiveで受け取ります。 - オブジェクトは自由に共有するのではなく、コピーまたは移動します。
Ractor.make_shareableはデータを凍結し、安全に共有できるようにします。
これで、スレッド、GVL、ファイバー、Ractorを扱うRuby並行処理コースは完了です。
よくある質問
「Ractor」レッスンは無料ですか?
はい。「Ractor」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Ruby Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Ruby Academyコースには全4レッスンが含まれています。
「Ractor」で何を学びますか?
真の並列処理です。 ブラウザで直接実行するハンズオンコードでRuby Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Ruby Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのRuby Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。
「Ractor」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このRuby Academyレッスンでコードを書いて実行できますか?
はい。すべてのRuby Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。