0
我的目标是让系统每隔10分钟为37,500个城市广播一个广告。大约需要5分钟为所有城市进行数据库查询,计算和AMQP IO。使用EventMachine定期计时器的可靠计时
代码大致结构类似:
EventMachine.add_periodic_timer(10 minutes) do
the_task_that_takes_five_minutes
end
什么我的发现是,即使计时器设置为每隔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是否属实?
这并不能真正解决问题,因为我仍然需要每10分钟进行一次新的计算才能进行广播,而且我宁愿将它安排在Ruby上,而不是像cron工作一样。 – onyxrev 2013-02-20 09:17:29
据我所知,如果计算时间少于10分钟,新的*计算*将被广播。 – Sikian 2013-02-20 13:57:41