如何在一定时间后杀死红宝石线?

时间:2011-10-26 01:19:57

标签: 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 on asynchronously from both threads
end

2 个答案:

答案 0 :(得分:6)

也许Timeout课程就是你所需要的。

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

  # continue on asynchronously
end

答案 1 :(得分:3)

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

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