我在Heroku中有这个工作进程,它可以进行一些清理工作。它每两小时运行一次并收听Heroku终止信号。它工作正常,但我看到100%dyno一直负载。
我的问题是:如何在没有100%dyno加载的情况下在Heroku中运行这种工作进程?循环导致dyno加载,但是使用什么而不是无限循环?
# Scheduler here
cleanup = Rufus::Scheduler.new
cleanup.cron '* */2 * * *' do
do_some_cleaning
end
# Signal trapping
Signal.trap("TERM") {
terminate = true
shut_down
exit 0
}
# Infinite loop
while terminate == false
end
答案 0 :(得分:2)
这是因为你在无睡眠周期的情况下进行无限循环。这意味着您基本上告诉CPU您应该立即执行循环条件的每个循环。
这会很快耗尽你的CPU。
相反,尝试将睡眠语句抛入无限循环 - 这会暂停执行并将使用率降低到0%=)
while terminate == false
sleep 1
end
答案 1 :(得分:1)
我应该早点考虑一下。你实际上可以简单地加入rufus-scheduler的循环:
cleanup_scheduler = Rufus::Scheduler.new
cleanup_scheduler.cron '* */2 * * *' do
do_some_cleaning
end
Signal.trap('TERM') do
shut_down
exit 0
end
cleanup_scheduler.join
加入rufus-scheduler调度线程,伪等价于:
while !terminated
sleep 0.3
trigger_schedules_if_any
end