某种红宝石“中断”
问题描述:
所以这就是我正在做的 - 我有一个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%),所以它非常浪费。我怎样才能做到类似这样的事情:每隔一段时间更新一次事件,而不浪费大量周期?
所有帮助表示感谢,并提前致谢!
答
如果你是刚刚捕获CTRL-C中断和Don”介意短暂的等待按下按键,它打破了,然后......之间
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
“睡眠”功能,使用系统定时器,所以不使用了CPU在等待。如果你想要更精细的分辨率时间,只需更换睡眠1与睡眠0.5或更小,以减少检查之间的时间,
答
您有几种解决方案。例如,如果您希望获得许多信号并希望将它们中的每一个都作为事件处理,则可以使用Thread :: Queue。如果你真的只是在等待^ C到与其他线程没有复杂的相互作用发生,我认为这可能是简单的使用线程#唤醒:
c = Thread.current
Signal.trap("SIGINT") do
c.wakeup
end
while true
sleep
puts "wake"
end