使用EventMachine定期计时器实现可靠的计时

时间:2013-02-20 08:17:49

标签: ruby timer eventmachine

我的目标是建立一个系统,每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来说是真的吗?

1 个答案:

答案 0 :(得分:1)

这只是一个想法,但也许定时器可能只是为了播放广告而触发该功能,而不是进行所有计算。

EventMachine.add_periodic_timer(10 minutes) do
  ad_broadcasting calculations
  EM.defer
    calculations = Calc.new
  end
end

我不确定是否推迟计算会避免EM等待它。