У меня есть следующий код:
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)