Perl 中是否有启动/停止计时器。我曾尝试过 AnyEvent 但这就像一个一次性或重复的计时器。设置后,我可以重置超时间隔。
我有一个要求,如果在定时器超时间隔内发生事件,我必须重置定时器。是否有任何 Perl 模块可以完成这项工作?
提前致谢。
Perl 中是否有启动/停止计时器。我曾尝试过 AnyEvent 但这就像一个一次性或重复的计时器。设置后,我可以重置超时间隔。
我有一个要求,如果在定时器超时间隔内发生事件,我必须重置定时器。是否有任何 Perl 模块可以完成这项工作?
提前致谢。
更新
这个问题实际上在#mojo IRC 频道上引发了相当多的讨论。最终结果是,除非出现一些不可预见的问题,否则即将发布的 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;
}
原来的
这是直接使用Mojo::IOLoop的快速而肮脏的方法。如果这是在服务器内运行,您可能不需要start
andstop
方法。基本上,有一个倒计时变量可以在其他地方重置,并且循环计时器会检查该倒计时是否在它开始繁荣之前已经过期。
#!/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
此处使用的事件仅用于显示经过的时间,对流程并不重要。