From: Farrel Lifson Date: 2006-11-13T23:30:34+09:00 Subject: Re: waiting for multiple child processes to finish On 13/11/06, Martin DeMello wrote: > Why does this not work (it waits for each process to finish before > launching the next): > ------------------------------------------------------------- > $stdout.sync = true > > 10.times {|i| > pid = Process.fork { > puts "launching process #{i}" > 3.times { > sleep 0.5 > puts "hello from process #{i}" > } > } > Thread.new { Process.waitpid(pid) }.join > } > > puts "done!" > ------------------------------------------------------------- > > but this does: > ------------------------------------------------------------- > $stdout.sync = true > > pids = [] > 10.times {|i| > pids << Process.fork { > puts "launching process #{i}" > 3.times { > sleep 0.5 > puts "hello from process #{i}" > } > } > } > > pids.each {|pid| Thread.new { Process.waitpid(pid) }.join } > puts "done!" > ------------------------------------------------------------- The join in the first solution forces the thread (and forked process) to finish before continuing onto starting the next fork. In the second solution all the processes are forked first before waiting. You can probably rewrite that last loop simply as: pids.each{|pid| Process.waitpid(pid)} Farrel