在Perl中是否有啓動/停止定時器?我曾嘗試過AnyEvent,但這就像一次或重複定時器。一旦設置,我可以重置超時間隔。在perl中啓動停止重置定時器
我有一個要求,如果在定時器超時間隔內發生事件,我必須重置定時器。有沒有Perl模塊可以完成這項工作?
在此先感謝。
在Perl中是否有啓動/停止定時器?我曾嘗試過AnyEvent,但這就像一次或重複定時器。一旦設置,我可以重置超時間隔。在perl中啓動停止重置定時器
我有一個要求,如果在定時器超時間隔內發生事件,我必須重置定時器。有沒有Perl模塊可以完成這項工作?
在此先感謝。
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。如果這是在服務器內部運行的,則可能不需要start
和stop
方法。基本上有一個倒計時變量,它可以在其他地方重置,定期計時器檢查倒計時是否在失敗之前過期。
#!/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
事件只是說明經過的時間,不流動的重要。
發表您如何以及您正在努力完成的示例 – hwnd 2013-05-09 15:31:00