alarm()
您可以使用与 DBI 相关的信号来使用和来实现超时$SIG{ALRM}
。
从cpan 和cpan pod上的DBI模块
暂停
实现超时的传统方法是设置 $SIG{ALRM} 来引用将在 ALRM 信号到达时执行的一些代码,然后调用 alarm($seconds) 来安排在 $seconds 中传递 ALRM 信号未来。
例如:
我的 $dbh = DBI->connect("DBI:SQLRelay:host=$hostname;port=$port;socket=", $user, $password) 或死 DBI->errstr;
我的 $sth = $dbh->prepare($query) 或死 $dbh->errstr;
eval {
local $SIG{ALRM} = sub { die "TIMEOUT\n" }; # \n is required
eval {
alarm($seconds);
if(! $sth->execute() ) { # execute query
print "Error executing query!\n"
}
};
# outer eval catches alarm that might fire JUST before this alarm(0)
alarm(0); # cancel alarm (if code ran fast)
die "$@" if $@;
};
if ( $@ eq "TIMEOUT\n" ) { ... }
elsif ($@) { ... } # some other error
第一个(外部)评估用于避免“要执行的代码”死掉并且警报在取消之前触发的不太可能但可能的机会。如果没有外部 eval,如果发生这种情况,如果您没有 ALRM 处理程序或将调用非本地警报处理程序,您的程序将死亡。