我正在使用EV來定期(每5分鐘)查詢我的「事件隊列」表,並觸發任何超過其「觸發」時間的事件。這很好。使用EV爲以後安排事件
但是經常,觸發時間將是幾天或幾周。因爲我提前知道觸發時間,所以我應該能夠減少EV循環的頻率,但仍然可以在請求的確切時間觸發事件,而不必等到循環的下一次迭代。
在EV中有沒有辦法做到這一點?我想假設創建一個觀察者會是解決方案嗎?這是如何完成的?
我正在使用EV來定期(每5分鐘)查詢我的「事件隊列」表,並觸發任何超過其「觸發」時間的事件。這很好。使用EV爲以後安排事件
但是經常,觸發時間將是幾天或幾周。因爲我提前知道觸發時間,所以我應該能夠減少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);
如果無法刪除數據庫中的記錄,你可以在記錄中設置一個標記,它被處理,也可以使用哈希由記錄標識索引。
我假設$w
作爲第一個參數傳遞給回調函數。不調整。
請添加一些僞代碼或您想要實現的具體示例。謝謝 – average 2013-03-23 00:42:55