我正在寻找一个演示 ruby 计时器的在线示例,并发现了下面的代码。
它按预期工作,但是这个简单的程序使用 30Mo 内存(如 Windows 任务管理器中所示)和太多的 CPU 有意义吗?
多谢
def time_block
start_time = Time.now
Thread.new { yield }
Time.now - start_time
end
def repeat_every(seconds)
while true do
time_spent = time_block { yield } # To handle -ve sleep interaval
sleep(seconds - time_spent) if time_spent < seconds
end
end
repeat_every(5) {
}
正如该问题的评论中所指出的,要使其正常工作,只需加入该线程即可:
#!/usr/bin/ruby1.8
def repeat_every(interval, &block)
loop do
start_time = Time.now
Thread.new(&block).join
elapsed = Time.now - start_time
sleep([interval - elapsed, 0].max)
end
end
repeat_every(5) do
puts Time.now.to_i
end
# => 1266437822
# => 1266437827
# => 1266437832
...
但是,就目前情况而言,没有理由对问题中的代码使用线程:
def repeat_every(interval)
loop do
start_time = Time.now
yield
elapsed = Time.now - start_time
sleep([interval - elapsed, 0].max)
end
end
repeat_every(5) do
puts Time.now.to_i
end
# => 1266437911
# => 1266437916
# => 1266437921
现在,如果您想要一个线程每隔一定时间执行某些操作,以便主程序可以执行其他操作,那么您将把整个循环包装在一个线程中。
def repeat_every(interval)
Thread.new do
loop do
start_time = Time.now
yield
elapsed = Time.now - start_time
sleep([interval - elapsed, 0].max)
end
end
end
thread = repeat_every(5) do
puts Time.now.to_i
end
puts "Doing other stuff..."
thread.join
# => 1266438037
# => Doing other stuff...
# => 1266438042
# => 1266438047
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)