他のいくつかの関数を呼び出す関数があります。
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 サブルーチンを処理しているときに がペイロード関数を中断するとどうなるか不安です。私の腸は正しいですか?