Perl 报警重试
Perl Retry on alarm
我正在尝试在触发警报时重试某些逻辑。那可能吗。
我定义的闹钟如下:
local $SIG{ALRM} = sub {
if($attempt <=5) {
print "NExt attempt\n";
$attempt = $attempt + 1;
my $val = subroutine_call();
} else{
Carp::confess "Die now\n";
}
我的代码片段如下:
foreach my $x (@array)
{
eval {
alarm(2);
my $val = subroutine_call();
alarm(0);
};
print "Moving on \n";
## some code
}
我希望在终止应用程序之前在触发警报时重试调用 subroutine_call 最多 3 次。调用subrountine_call(不管是否触发报警后调用)后,应该显示打印语句。
我知道一旦触发了alarm,代码流程就会出现偏差,subrountine_call通过alarm定义,不会执行print语句。我希望它的行为就像没有触发警报一样。
这可能吗?我持怀疑态度,但想知道是不是这样。
谢谢,
local $SIG{ALRM} = sub { die "alarm\n"; };
for my $x (@array) {
my $attempts_remaining = 3;
while (1) {
last if eval {
alarm(2);
subroutine_call();
alarm(0);
return 1;
};
my $e = $@;
die($e) if $e ne "alarm\n";
die("Timeout!\n") if !--$attempts_remaining;
warn("Timeout! Trying again...\n");
}
}
我正在尝试在触发警报时重试某些逻辑。那可能吗。 我定义的闹钟如下:
local $SIG{ALRM} = sub {
if($attempt <=5) {
print "NExt attempt\n";
$attempt = $attempt + 1;
my $val = subroutine_call();
} else{
Carp::confess "Die now\n";
}
我的代码片段如下:
foreach my $x (@array)
{
eval {
alarm(2);
my $val = subroutine_call();
alarm(0);
};
print "Moving on \n";
## some code
}
我希望在终止应用程序之前在触发警报时重试调用 subroutine_call 最多 3 次。调用subrountine_call(不管是否触发报警后调用)后,应该显示打印语句。
我知道一旦触发了alarm,代码流程就会出现偏差,subrountine_call通过alarm定义,不会执行print语句。我希望它的行为就像没有触发警报一样。
这可能吗?我持怀疑态度,但想知道是不是这样。
谢谢,
local $SIG{ALRM} = sub { die "alarm\n"; };
for my $x (@array) {
my $attempts_remaining = 3;
while (1) {
last if eval {
alarm(2);
subroutine_call();
alarm(0);
return 1;
};
my $e = $@;
die($e) if $e ne "alarm\n";
die("Timeout!\n") if !--$attempts_remaining;
warn("Timeout! Trying again...\n");
}
}