2013-02-20 34 views
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是否属实?

回答

1

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

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

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

+0

这并不能真正解决问题,因为我仍然需要每10分钟进行一次新的计算才能进行广播,而且我宁愿将它安排在Ruby上,而不是像cron工作一样。 – onyxrev 2013-02-20 09:17:29

+0

据我所知,如果计算时间少于10分钟,新的*计算*将被广播。 – Sikian 2013-02-20 13:57:41