Моя цель — иметь систему, которая транслирует рекламу каждые 10 минут в 37 500 городов. Выполнение запросов к БД, расчетов и AMQP IO для всех городов занимает около 5 минут.
Код примерно структурирован так:
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?