Perl 中设置计时器以停止 long-运行 进程的最佳方法是什么?
What is best way in Perl to set a timer to stop long-running process?
我有一个应用程序调用了一个可能很长的 运行 进程。我希望我的程序(此进程的调用者)在任何给定点取消它,并在超过时间限制时继续下一个条目。使用 Perl 的 AnyEvent 模块,我尝试了这样的事情:
#!/usr/bin/env perl
use Modern::Perl '2017';
use Path::Tiny;
use EV;
use AnyEvent;
use AnyEvent::Strict;
my $cv = AE::cv;
$cv->begin; ## In case the loop runs zero times...
while ( my $filename = <> ) {
chomp $filename;
$cv->begin;
my $timer = AE::timer( 10, 0, sub {
say "Canceled $filename...";
$cv->end;
next;
});
potentially_long_running_process( $filename );
$cv->end;
}
$cv->end;
$cv->recv;
exit 0;
sub potentially_long_running_process {
my $html = path('foo.html')->slurp;
my @a_pairs = ( $html =~ m|(<a [^>]*>.*?</a>)|gsi );
say join("\n", @a_pairs);
}
问题是长时间 运行 进程永远不会超时并被取消,它们只是继续进行。所以我的问题是 "How do I use AnyEvent (and/or related modules) to time out a long-running task?"
你没有提到你运行这个脚本所在的平台,但是如果它是运行在*nix上,你可以使用SIGALRM信号,像这样:
my $run_flag = 1;
$SIG{ALRM} = sub {
$run_flag = 0;
}
alarm (300);
while ($run_flag) {
# do your stuff here
# note - you cannot use sleep and alarm at the same time
}
print "This will print after 300 seconds";
我有一个应用程序调用了一个可能很长的 运行 进程。我希望我的程序(此进程的调用者)在任何给定点取消它,并在超过时间限制时继续下一个条目。使用 Perl 的 AnyEvent 模块,我尝试了这样的事情:
#!/usr/bin/env perl
use Modern::Perl '2017';
use Path::Tiny;
use EV;
use AnyEvent;
use AnyEvent::Strict;
my $cv = AE::cv;
$cv->begin; ## In case the loop runs zero times...
while ( my $filename = <> ) {
chomp $filename;
$cv->begin;
my $timer = AE::timer( 10, 0, sub {
say "Canceled $filename...";
$cv->end;
next;
});
potentially_long_running_process( $filename );
$cv->end;
}
$cv->end;
$cv->recv;
exit 0;
sub potentially_long_running_process {
my $html = path('foo.html')->slurp;
my @a_pairs = ( $html =~ m|(<a [^>]*>.*?</a>)|gsi );
say join("\n", @a_pairs);
}
问题是长时间 运行 进程永远不会超时并被取消,它们只是继续进行。所以我的问题是 "How do I use AnyEvent (and/or related modules) to time out a long-running task?"
你没有提到你运行这个脚本所在的平台,但是如果它是运行在*nix上,你可以使用SIGALRM信号,像这样:
my $run_flag = 1;
$SIG{ALRM} = sub {
$run_flag = 0;
}
alarm (300);
while ($run_flag) {
# do your stuff here
# note - you cannot use sleep and alarm at the same time
}
print "This will print after 300 seconds";