【Ruby3.x】Ractor::send()メソッドの使い方
sendメソッドの使い方について、初心者にもわかりやすく解説します。
基本的な使い方
sendメソッドは、Ruby 3で導入された並行処理の仕組みであるRactorにおいて、別のRactorへオブジェクトを安全に送信するメソッドです。Ractor間の通信は、このsendメソッドと、それを受け取るRactor#recvメソッドを通して行われることが基本原則です。
このメソッドは、target_ractor.send(object)のように使用します。ここでobjectには、送信したい任意のRubyオブジェクトを指定します。sendメソッドが呼び出されると、指定されたオブジェクトは送信先のRactorの内部キューに追加されます。受信側のRactorは、Ractor#recvメソッドを呼び出すことで、このキューからオブジェクトを取り出し、処理を進めることができます。
Ractorは「Share Nothing(何も共有しない)」という原則に基づいて設計されており、通常、sendメソッドで送信されるオブジェクトは自動的に複製(deep copy)されます。これにより、複数のRactor間で同じオブジェクトを直接共有することによる予期せぬ競合状態やデータ破壊を防ぎ、並行処理の安全性を高めます。ただし、フリーズされた文字列やシンボルなど、変更不可能な一部のオブジェクトは複製されずに共有される場合があります。
また、送信先のRactorのキューが一時的に満杯になった場合、sendメソッドは受信側のRactorがオブジェクトを受け取るまで、一時的に処理をブロックすることがあります。この特性は、送信側と受信側のRactorが互いの処理速度に応じて協調し、システム全体の過負荷を防ぐ効果も持ちます。sendメソッドは、Ractorを使った並行処理において、データやメッセージを確実にやり取りするための非常に重要な手段です。
構文(syntax)
1ractor = Ractor.new do 2 # Ractor内の処理 3end 4 5ractor.send("送信するオブジェクト", move: false)
引数(parameters)
obj, move: false
- obj: Ractor間で受け渡すオブジェクト
- move: false: オブジェクトの所有権を移動させるかどうかを指定する真偽値 (デフォルトは false)
戻り値(return)
Ractor
Ractorオブジェクトを返します。これは、メッセージが正常に送信されたことを示し、受信側のRactorと通信するために使用されます。