1

私の目的は、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にも当てはまりますか?

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 に答える