2013-05-09 3 views
1

Perl에 시작/중지 타이머가 있습니까? AnyEvent를 시도했지만 이것은 한 번 또는 반복 타이머와 같습니다. 일단 설정되면 타임 아웃 간격을 재설정 할 수 있습니다.perl에서 시작 중지 타이머 재설정

타이머 제한 시간 내에 이벤트가 발생하면 타이머를 재설정해야한다는 요구 사항이 있습니다. 이 작업을 수행하는 Perl 모듈이 있습니까?

미리 감사드립니다.

+2

달성하려는 방법과 방법의 예를 게시하십시오. – hwnd

답변

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를 유지하는 것이 좋습니다. 이렇게하면 타이머가 효과적으로 재설정됩니다. 여기에 사용되는 recurring 이벤트가 경과 된 시간을 표시하는 단지이며, 흐름에 중요하지 않은 것을

#!/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; 
} 

참고.