Ruby和Threads - 为什么我的脚本没有完成?

时间:2018-05-18 12:34:51

标签: ruby multithreading

我有一个脚本,可以使用Thread远程为集群配置节点,这样我就可以一次完成所有这些节点。

有没有更好的方法可以做到这一点,所以我得到一个返回代码,一个干净的退出,以及一个似乎没有运行一段时间的脚本?

@threads = []

def process_node(apps_to_close, node)
  @threads << Thread.new do
    puts "now processing node #{node}\n"
    ...
  end
end

nodes.each do |node|
  process_node(apps_to_close, node)
end

@threads.each {|thr| thr.join}

1 个答案:

答案 0 :(得分:1)

您可以通过join限制允许线程运行的时间,如果线程在达到超时时仍在运行,则返回nil。所以你可以把它重写为:

...

results = @threads.collect { |thr| thr.join(1) } # wait 1 second for thread
@threads.each { |t| Thread.kill(t) }
results.any?(&:nil?) ? exit(1) : exit(0)