2013-03-23 40 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