首页 > 解决方案 > Ruby and Threads - 为什么我的脚本没有完成?

问题描述

我有一个脚本,它使用 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}

标签: rubymultithreading

解决方案


您可以通过 限制允许线程运行的时间量,如果达到超时时线程仍在运行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)

推荐阅读