注意:Ractorならではとか、計算効率の良さとか考えていません。
1から10までを足す
# 最終結果送り先のRactor CR = Ractor.current r = Ractor.new { CR << Ractor.recv } 1.upto(10) do |i| # 数を足すRactorを作ってポインタを置き換える r = Ractor.new(r, i) do |next_r, i| # 担当の整数を足して次のRactorに送る next_r << Ractor.recv + i end end r << 0 # 計算開始。初期値を送る p Ractor.recv # 結果を出力
<<
でRactorインスタンスに値を送ります。
Ractor.recv
で値を受け取ります。
並列に動いていません。
10個のRactorを並列に動かす
# 10個のRactorを作る ractor_list = (1..10).map do |i| Ractor.new i do |i| i end end # 10個のRactorの終わりを待つ until ractor_list.empty? # いずれかのRactorの結果を待つ r, val = Ractor.select(*ractor_list) p val # 実行の終わったRactorは、もう待たない ractor_list.delete r end
Ractor.select
でRactorインスタンスの終了を待ちます。
Ractor.new
に渡したブロックの戻り値が得られます。