次のコードがあります。
data_set = [1,2,3,4,5,6]
results = []
data_set.each do |ds|
puts "Before fork #{ds}"
r,w = IO.pipe
if pid = Process.fork
w.close
child_result = r.read
results << child_result
else
puts "Child worker for #{ds}"
sleep(ds * 5)
r.close
w.write(ds * 2)
exit
end
end
Process.waitall
puts "Ended everything #{results}"
基本的に、私は各子に何らかの作業をさせてから、結果を親に渡したいと思っています。私のコードは現在並列で実行されていません。私の問題がどこにあるのか正確にはわかりません。おそらく、親で読み取りを行っているためですが、よくわかりません。非同期で実行するにはどうすればよいですか?
編集:コードをこれに変更しましたが、問題なく動作するようです。私が見ていない問題はありますか?
data_set = [1,2,3,4,5,6]
child_pipes = []
results = []
data_set.each do |ds|
puts "Before fork #{ds}"
r,w = IO.pipe
if pid = Process.fork
w.close
child_pipes << r
else
puts "Child worker for #{ds}"
sleep(ds * 5)
r.close
w.write(ds * 2)
exit
end
end
Process.waitall
puts child_pipes.map(&:read)