所以这就是我正在做的事情 - 我有一个每分钟打印出信息的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%),所以它非常浪费。我怎样才能做类似的事情,每隔一段时间更新一次事件,而不浪费大量的周期?
所有帮助都表示赞赏,并提前致谢!
答案 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 ,或者甚至更小以减少检查之间的时间,