某种Ruby“中断”

时间:2010-10-19 07:13:29

标签: ruby exception-handling signals

所以这就是我正在做的事情 - 我有一个每分钟打印出信息的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

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

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

2 个答案:

答案 0 :(得分:7)

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

c = Thread.current

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

while true
  sleep
  puts "wake"
end

答案 1 :(得分:4)

如果您只是捕获ctrl-c中断,并且不介意在按下按键之间等待一段时间,那么它会突然出现......

switch = true

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

lastTime = Time.now

while switch do
    sleep 1
    if Time.now.min > lastTime.min then
        puts "A minute has gone by!"
    end
end

'sleep'功能使用系统计时器,因此在等待时不会耗尽CPU。如果你想要更精细的分辨率计时,只需用 sleep 0.5 替换 sleep 1 ,或者甚至更小以减少检查之间的时间,