0Pricing
Ruby Academy · レッスン

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.take

Pushと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フィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. スレッド
  2. GVL の解説
  3. Fiber
  4. Ractor
← Ruby Academyに戻る