@ledsun blog

無味の味は佳境に入らざればすなわち知れず

Ractorを使ってプログラムを書く練習    

注意: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に渡したブロックの戻り値が得られます。

参考

https://github.com/ko1/ruby/blob/ractor/ractor.ja.md