我的目标是建立一个每 10 分钟为 37,500 个城市播放广告的系统。所有城市的数据库查询、计算和 AMQP IO 大约需要 5 分钟。
代码的结构大致如下:
EventMachine.add_periodic_timer(10 minutes) do
the_task_that_takes_five_minutes
end
我发现即使计时器设置为 10 分钟间隔,即使任务花费不到 10 分钟,命令也会以 15 分钟间隔触发(完成任务所需的时间 + EM 周期。)
如果我们假设任务永远不会超过 10 分钟,那么无论任务处理时间如何,我将如何确保计时器的周期始终与上次运行正好 10 分钟?
EM 基本上似乎在任务运行后设置下一个计时器,而不是之前。
我围绕任务批处理本身尝试了一个简单的 EM.defer。我以为这会打开设置下一个计时器的线程,但这并不能解决问题。
我可以摆脱以下吗?
def do_stuff
EventMachine.add_timer(10 minutes) do
do_stuff
end
the_task_that_takes_five_minutes
end
do_stuff
我知道我可以在 Javascript 中做这种事情,因为计时器不会在 do_stuff 调用堆栈中执行。EventMachine 是这样吗?