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