我正在使用 EV 定期(每 5 分钟)查询我的“事件队列”表,并触发任何超过其“触发”时间的事件。这很好用。
但通常,触发时间将是未来几天或几周。因为我提前知道了触发时间,所以我应该能够减少我的 EV 循环的频率,但仍然会在请求的确切时间触发事件,而不必等到我的循环的下一次迭代。
有没有办法在 EV 中做到这一点?我想即时创建一个观察者会是解决方案吗?这是怎么做到的?
我正在使用 EV 定期(每 5 分钟)查询我的“事件队列”表,并触发任何超过其“触发”时间的事件。这很好用。
但通常,触发时间将是未来几天或几周。因为我提前知道了触发时间,所以我应该能够减少我的 EV 循环的频率,但仍然会在请求的确切时间触发事件,而不必等到我的循环的下一次迭代。
有没有办法在 EV 中做到这一点?我想即时创建一个观察者会是解决方案吗?这是怎么做到的?
像下面这样的东西应该可以解决问题:
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
作为第一个参数传递给回调。不行就调整。