我有一个调用其他几个函数的函数,例如
sub do_work {
send_mail();
send_soap_envelope();
send_rpc();
}
被调用的函数可能会挂起,所以我想在超时后停止它们。我想避免分叉,因为它在我的上下文中很昂贵(例如,每次分叉后都需要重新创建数据库句柄)。我想出了以下方案:
sub timeout {
my ($code) = @_;
eval {
alarm 2;
local $SIG{ALRM} = sub { die 'timeout' };
&$code;
alarm 0;
};
# handling of $@ eq 'timeout' removed for brevity
}
sub do_work {
timeout \&send_mail;
timeout \&send_soap_envelope;
timeout \&send_rpc;
};
该timeout()
函数(在此示例中硬编码为 2 秒超时)使用eval
块作为中止使用die
.
这在我的测试场景中工作得很好,但是我对如果在die
Perl 解释器不处于“安全状态”时中断有效负载函数会发生什么感到不安,例如,当它正在处理 XS 子例程时。我的直觉对吗?