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

标签 perl mojolicious

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

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

提前致谢。

最佳答案

更新

这个问题实际上在 #mojo IRC channel 上引起了相当多的讨论。 .最终结果是,除非出现一些不可预见的问题,否则即将发布的 Mojolicious 4.0 版本将包含一个新的 react 器方法 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 的快速而肮脏的方法直接地。如果这是在服务器内部运行,您可能不需要 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 事件只是为了显示耗时,对流程并不重要。

关于perl - 在 perl 中启动停止重置计时器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16465300/

相关文章:

perl - 从今天减去天数并比较

perl - 管道的 Ctrl+Z 字符和 EOF 问题

linux - 如何调查卡住的进程 - perl 脚本

perl - 使用 Mojo::DOM 时 NBSP 格式错误

Perl Mojolicious 模型

regex - Perl 中的环视断言

perl - 如何在 Perl 中解析用户代理字符串?

perl - 在 mojolicious 中将参数传递给 redirect_to 并在目标 Controller 中使用它们

perl - 无法使用 mojolicious 以 xml 形式发送 HTTP 响应

perl - 欢快的 : syntax-highlighting for inlined templates