0

非常に正確な時間にプロセスを実行したい。現在、遅延ジョブを使用しています:

handle_asynchronously :make_live, :run_at => (exact_time_down_to_the_second)

しかし、それはまったく正確ではありません。たとえば、私がするとき:

handle_asynchronously :make_live, :run_at => (Time.now + 30.seconds)

...30 秒 +/- 15 秒で実行されます。後続の試行は 6 秒以内に発生しTime.now、場合によってはほぼ瞬時に発生します。

これを行う正確な方法はありますか?遅れた仕事にとらわれない。

編集

私がする時:

handle_asynchronously :make_live, :run_at => Proc.new {|event| event.occurs_at }

...うまく機能します(キューを秒単位でポーリングするようです)。短い間隔 (30 秒) を使用している場合でも。

うまく機能していないのは、コンソールのテストだけのようです。

それで、今のところ私の問題は解決します。

4

3 に答える 3

0

わかった。あなたのジョブラッパーはあなたにとって十分に正確ではありません. 2 つのオプションが表示されます。

  1. より正確になるように、ジョブ ラッパーを置き換えるか修正します。Resque が役立つかもしれませんし、Delayed::Job の内部を調べてより頻繁にジョブをポーリングすることもできます。実行可能ですが、私はこのハックを好みます:
  2. ジョブの実行が必要になる 60 秒前にジョブをスケジュールします。ジョブを実行する必要がある正確な時間をパラメーターとして渡します。次に、実行しますsleep until Time.now == exact_time_down_to_the_second

ブーム!秒単位まで正確に実行します。

于 2012-05-15T05:52:57.623 に答える
0

遅延ジョブは、デフォルトで 5 秒ごとにデータベースをポーリングするように設定されています。これを調整して、毎秒ポーリングすることができます。このレベルの精度が必要なユースケースに興味があります。たぶん、より良い解決策がありますか?

于 2012-05-29T18:33:44.933 に答える
0

遅延は、おそらく次の 2 つの要因によって引き起こされます。遅延ジョブは定期的にジョブをチェックします。遅延ジョブもジョブを順次実行するため、キューにすでにいくつかのジョブがある場合、遅延が発生します。

タスクを事前に知っていて定義できる場合 (つまり、現在の時刻に関連していない場合)、cronjobsのラッパーである Always gem を使用します。

Delayedjobs 用に別のキューを作成すると、長いキューによる遅延を減らすこともできます。

Resqueに切り替えることもできます。これはメモリ内キューのようなもので、おそらく短い間隔でキューをチェックします。

于 2012-05-15T05:33:36.313 に答える