Perl 如何使DBD::Pg可靠地超时?
为什么这段代码在$sth->execute完成之前不执行信号处理程序?更重要的是,我如何修复它Perl 如何使DBD::Pg可靠地超时?,perl,signals,dbi,Perl,Signals,Dbi,为什么这段代码在$sth->execute完成之前不执行信号处理程序?更重要的是,我如何修复它 #!/usr/bin/perl use strict; use warnings; use DBI; use Sys::SigAction qw( set_sig_handler ); my $dbh = DBI->connect('dbi:Pg:dbname=dc'); eval { my $h = set_sig_handler('ALRM', sub { die "time
#!/usr/bin/perl
use strict;
use warnings;
use DBI;
use Sys::SigAction qw( set_sig_handler );
my $dbh = DBI->connect('dbi:Pg:dbname=dc');
eval {
my $h = set_sig_handler('ALRM', sub { die "timeout\n" });
eval {
alarm 1;
my $sth = $dbh->prepare("SELECT pg_sleep(10)");
print "Before execute\n";
$sth->execute;
print "After execute\n";
$sth->finish;
};
alarm 0;
die "$@" if $@;
};
die "$@" if $@;
print "Finished\n";
考虑改用Pg的功能。由于Perl处理信号的方式发生了变化(从5.8.0开始称为“安全信号”),您需要使用它来允许您的
die()
在执行过程中工作 有一种方法允许异步查询PostgreSQL,但它与DBI不兼容,它会迫使您重写应用程序/脚本。是的,我也尝试过。不幸的是,如果不在同一个地方冻结,就无法等待相同的查询。也就是说,除非我想使用睡眠循环,这会增加不必要的延迟。