如何在执行下一行之前等待所有线程完成

时间:2014-09-22 12:57:50

标签: ruby

我有类似下面的内容:

all_hosts.each do |hostname|   
  Thread.new {
    ...
  }
end
# next line of execution

上面的每个主机都会打开自己的线程并执行命令。我想等待所有线程完成执行,然后再转到下一部分文件。这样做有简单的方法吗?

2 个答案:

答案 0 :(得分:4)

使用Thread#join等待终止线程。

要做到这一点,你需要保存线程;所以请使用map代替each

threads = all_hosts.map do |hostname|   
  Thread.new {
    # commands
  }
end

threads.each(&:join)

答案 1 :(得分:2)

Thread documentation解释了它:

  

或者,您可以使用数组一次处理多个线程,如下例所示:

threads = []
threads << Thread.new { puts "Whats the big deal" }
threads << Thread.new { 3.times { puts "Threads are fun!" } }
     

创建几个线程后,我们等待它们全部连续完成。

threads.each { |thr| thr.join }

应用于您的代码:

threads = []

all_hosts.each do |hostname|
  threads << Thread.new { ... }
end

threads.each(&:join)

# next line of execution