Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 如何使DBD::Pg可靠地超时?_Perl_Signals_Dbi - Fatal编程技术网

Perl 如何使DBD::Pg可靠地超时?

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

为什么这段代码在$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 "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不兼容,它会迫使您重写应用程序/脚本。

是的,我也尝试过。不幸的是,如果不在同一个地方冻结,就无法等待相同的查询。也就是说,除非我想使用睡眠循环,这会增加不必要的延迟。