私の目的は、37,500の都市に10分ごとに広告を放送するシステムを作ることです。すべての都市のDBクエリ、計算、およびAMQPIOを実行するのに約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
タイマーはdo_stuff呼び出しスタック内で実行されないため、Javascriptでそのようなことを実行できることはわかっています。これはEventMachineにも当てはまりますか?