某种Ruby"中断"

ada*_*m_0 4 ruby signals exception-handling

所以这就是我正在做的事情 - 我有一个ruby脚本,每分钟打印出信息.我还为陷阱设置了一个proc,这样当用户点击ctrl-c时,进程就会中止.代码看起来像这样:

switch = true

Signal.trap("SIGINT") do
    switch = false
end

lastTime = Time.now

while switch do
    if Time.now.min > lastTime.min then
        puts "A minute has gone by!"
    end
end
Run Code Online (Sandbox Code Playgroud)

现在代码本身是有效的并且运行良好,但它会做很多无用的工作,switch尽可能经常地检查它的值.它耗尽了尽可能多的处理器(至少是一个核心的100%),所以它非常浪费.我怎样才能做类似的事情,每隔一段时间更新一次事件,而不浪费大量的周期?

所有帮助表示赞赏,并提前致谢!

Jea*_*ean 7

你有几个解决方案.一种是使用Thread :: Queue,如果你期望很多信号,并希望将每个信号作为一个事件处理,例如.如果您真的只是在等待^ C发生而没有与其他线程的复杂交互,我认为使用Thread #wakeup可能很简单:

c = Thread.current

Signal.trap("SIGINT") do
  c.wakeup
end

while true
  sleep
  puts "wake"
end
Run Code Online (Sandbox Code Playgroud)