2013-03-23 35 views
0

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

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

在EV中有没有办法做到这一点?我想假设创建一个观察者会是解决方案吗?这是如何完成的?

+0

请添加一些伪代码或您想要实现的具体示例。谢谢 – average 2013-03-23 00:42:55

回答

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); 

如果无法删除数据库中的记录,你可以在记录中设置一个标记,它被处理,也可以使用哈希由记录标识索引。

我假设$w作为第一个参数传递给回调函数。不调整。

+0

我认为这是我想要做的,但是看不到EV的文档。问题是如何从周期性事件中创建一个计时器事件,其中计时器事件本身存在?还是我过度复杂? – Ryan 2013-03-23 01:06:01

+0

@Ryan,查看更新。 – ikegami 2013-03-23 05:44:05