使用EV为以后安排事件

时间:2013-03-23 00:39:16

标签: perl events event-handling

我正在定期(每5分钟)使用EV查询我的“事件队列”表,并触发任何超过其“触发”时间的事件。这很有效。

但通常,触发时间将是几天或几周。因为我事先知道触发时间,所以我应该能够降低EV循环的频率,但仍然会在请求的确切时间触发事件,而不是等到循环的下一次迭代。

在EV中有没有办法做到这一点?我想在飞行中创建一个观察者会是解决方案吗?这是怎么做到的?

1 个答案:

答案 0 :(得分: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);

如果您无法从数据库中删除记录,您可以在记录中设置一个标记,说明它已被处理,或者您可以使用由记录ID索引的哈希。

我假设$w作为第一个参数传递给回调。如果没有调整。