我有一個調用其他幾個函數的函數,例如這個非分叉Perl超時方法是否安全?
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 [email protected] 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子程序。我的直覺是對的嗎?
看起來像你心靈感應地將缺少的「警報0」線路傳送到我的頭上。在你的答案出現之前,我自己就想起了。不管怎麼說,還是要謝謝你。 –
新增示例。如果結束得太快,使'25'略大。 – ikegami