在perl中启动停止重置计时器

PMa*_*Mat 2 perl mojolicious

Perl中是否有启动/停止计时器.我曾尝试过AnyEvent,但这就像是一次性或反复出现的计时器.设置后,我可以重置超时间隔.

我有一个要求,如果在定时器超时间隔内发生事件,我必须重置定时器.是否有任何Perl模块可以完成这项工作?

提前致谢.

Joe*_*ger 9

UPDATE

这个问题实际上引发了对#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;
}
Run Code Online (Sandbox Code Playgroud)

原版的

这是一个快速和脏的直接使用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;
}
Run Code Online (Sandbox Code Playgroud)

如果您希望重置很多,上述方法会更有效.这是另一个例子,它是效率较低但更直接的例子.在这种情况下,想法是保留计时器的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;
}
Run Code Online (Sandbox Code Playgroud)

请注意,recurring此处使用的事件仅用于显示已用时间,对流程并不重要.