我的目标是建立一个系统,每37分钟为37,500个城市播放一则广告。所有城市的数据库查询,计算和AMQP IO大约需要5分钟。
代码的结构大致如下:
EventMachine.add_periodic_timer(10 minutes) do
the_task_that_takes_five_minutes
end
我发现即使计时器设置为10分钟,即使任务花费不到10分钟,命令也会以15分钟为间隔(完成任务所需的时间+ EM期间) 。)
如果我们假设任务永远不会超过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来说是真的吗?
答案 0 :(得分:1)
这只是一个想法,但也许定时器可能只是为了播放广告而触发该功能,而不是进行所有计算。
EventMachine.add_periodic_timer(10 minutes) do
ad_broadcasting calculations
EM.defer
calculations = Calc.new
end
end
我不确定是否推迟计算会避免EM等待它。