0

EVを使用して、定期的に(5分ごとに)「イベントキュー」テーブルにクエリを実行し、「トリガー」時間を過ぎたイベントを発生させています。これはうまくいきます。

しかし、多くの場合、トリガー時間は数日または数週間先になります。トリガー時間を事前に知っているので、EVループの頻度を減らすことができますが、ループの次の反復まで待つ必要はなく、要求された正確な時間にイベントを発生させることができます。

EVでこれを行う方法はありますか?その場でウォッチャーを作成することが解決策になると思いますか?これはどのように行われますか?

4

1 に答える 1

2

次のようなものでうまくいくはずです。

use constant DB_CHECK_PERIOD => 5*60;

sub handle_db_events {
   my ($w) = @_;

   while (1) {
      my $secs = ...get seconds to earliest unprocessed event from the db...;

      $secs //= DB_CHECK_PERIOD;
      if ($secs > 0) {
         $w->set($secs > DB_CHECK_PERIOD ? DB_CHECK_PERIOD : $secs, 0);
         return;
      }

      ... process events that have expired and delete them from the db ...;
   }
}

my $w = EV::timer(DB_CHECK_PERIOD, 0, \&handle_db_events);
handle_db_events($w);

DBからレコードを削除できない場合は、レコードに処理済みであることを示すフラグを設定するか、レコードIDでインデックス付けされたハッシュを使用できます。

$w最初の引数としてコールバックに渡されると仮定しています。そうでない場合は調整します。

于 2013-03-23T00:56:22.053 に答える