2013-05-09 19 views
1

在Perl中是否有啓動/停止定時器?我曾嘗試過AnyEvent,但這就像一次或重複定時器。一旦設置,我可以重置超時間隔。在perl中啓動停止重置定時器

我有一個要求,如果在定時器超時間隔內發生事件,我必須重置定時器。有沒有Perl模塊可以完成這項工作?

在此先感謝。

+2

發表您如何以及您正在努力完成的示例 – hwnd 2013-05-09 15:31:00

回答

8

UPDATE

這個問題實際上促使相當多的討論,對#mojo IRC channel。最終的結果是,除了一些未解決的問題,即將推出的Mojolicious 4.0版本將包含一個新的反應器方法again,它可以重新啓動定時器。事實證明,這種新方法(部分受到這個問題的啓發)在Mojolicious在特定情況下(高負載和高併發性)內部使用時提供了巨大的性能提升。一旦4.0發佈,請嘗試下面的第二個例子中的這個更新版本的例子:

#!/usr/bin/env perl 

use Mojo::Base -strict; 
use Mojo::IOLoop; 

my $loop = Mojo::IOLoop->singleton; 

my $now = 1; 
$loop->recurring(1 => sub { print $now++ . "\n" }); 

my $timer = $loop->timer(3 => \&boom); 

$loop->timer(2 => sub { 
    print "Event resets. No boom yet\n"; 
    $loop->reactor->again($timer); 
}); 

$loop->start; 

sub boom { 
    print "Boom!\n"; 
    $loop->stop; 
} 

ORIGINAL

這裏是一個快速和骯髒的直接使用Mojo::IOLoop。如果這是在服務器內部運行的,則可能不需要startstop方法。基本上有一個倒計時變量,它可以在其他地方重置,定期計時器檢查倒計時是否在失敗之前過期。

#!/usr/bin/env perl 

use Mojo::Base -strict; 
use Mojo::IOLoop; 

my $loop = Mojo::IOLoop->singleton; 

my $now = 1; 
my $timeout = 3; 
$loop->recurring(1 => sub { 
    print $now++ . "\n"; 
    boom() unless $timeout--; 
}); 

$loop->timer(2 => sub { 
    print "Event resets. No boom yet\n"; 
    $timeout = 3; 
}); 

$loop->start; 

sub boom { 
    print "Boom!\n"; 
    $loop->stop; 
} 

如果您預計您將要進行多次重置,上述方法效率更高。這是另一個效率較低但更直接的例子。在這種情況下,想法是保留定時器的ID,以便您可以刪除它並添加另一個。這有效地重置計時器。

#!/usr/bin/env perl 

use Mojo::Base -strict; 
use Mojo::IOLoop; 

my $loop = Mojo::IOLoop->singleton; 

my $now = 1; 
$loop->recurring(1 => sub { print $now++ . "\n" }); 

my $timer = $loop->timer(3 => \&boom); 

$loop->timer(2 => sub { 
    print "Event resets. No boom yet\n"; 
    $loop->remove($timer); 
    $timer = $loop->timer(3 => \&boom); 
}); 

$loop->start; 

sub boom { 
    print "Boom!\n"; 
    $loop->stop; 
} 

注意,這裏使用的recurring事件只是說明經過的時間,不流動的重要。