我有类似下面的内容:
all_hosts.each do |hostname|
Thread.new {
...
}
end
# next line of execution
上面的每个主机都会打开自己的线程并执行命令。我想等待所有线程完成执行,然后再转到下一部分文件。这样做有简单的方法吗?
答案 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