我如何在一段时间后杀死一个ruby线程?

我如何在一段时间后杀死一个ruby线程?,ruby,multithreading,Ruby,Multithreading,我想要一个线程,我创建死亡,如果它没有完成后,一定的时间。有什么优雅和/或惯用的方法可以做到这一点吗?现在我想做一个观察者线程: def myfunc t = Thread.new{ #do stuff } # watcher thread Thread.new{ result = t.join(20) # join returns nil if it timed out t.kill if result.nil? } # continue o

我想要一个线程,我创建死亡,如果它没有完成后,一定的时间。有什么优雅和/或惯用的方法可以做到这一点吗?现在我想做一个观察者线程:

def myfunc
  t = Thread.new{
    #do stuff
  }

  # watcher thread
  Thread.new{
    result = t.join(20) # join returns nil if it timed out
    t.kill if result.nil?
  }

  # continue on asynchronously from both threads
end

我相信在大多数情况下,您应该通过线程中的程序逻辑来控制线程的“生命”

假设线程实际上是一个无限循环,而不是一个普通的while(true),您可能有一个实例变量(例如is_正在运行)并使循环类似于while(is_正在运行)。如果其他线程想要停止这个线程,他们可以简单地(直接或间接地)使is_running为false。然后,工作线程可以完成手头的最后一项工作,并完成循环。

也许该类就是您所需要的

def myfunc
  Thread.new{
    Timeout::timeout(20) {
      #do stuff
    }
  }

  # continue on asynchronously
end

对。然而,在这种情况下,如果时间太长,我绝对想杀死它。啊哈,太好了!我正在编辑您的答案,以包括如何使用它来解决问题的示例…我认为您不需要将超时对象包装在线程中。超时为代码块创建了一个线程,所以你不必这样做,除非你想让整个事情都是异步的。是的,我想让它是异步的——这就是重点,我想让线程在卡住时自行清理。