1

我的目标是建立一个每 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 是这样吗?

4

1 回答 1

1

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

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

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

于 2013-02-20T09:11:27.687 回答