Perl:在Post请求中使用警报会产生奇怪的行为

时间:2016-02-24 22:17:47

标签: perl alarm lwp lwp-useragent

初步问题

我正在尝试使用Perl对远程服务器进行POST。我正在使用闹钟设置硬超时。当警报触发时,我得到了我认为是奇怪的行为。

这是代码:

eval {  

    local $SIG{ALRM} = sub {
        die("Foobar");
    };
    alarm 25;


    my $userAgent = new LWP::UserAgent( keep_alive => 1 );
    $answer = $userAgent->post( ... );

    # During a timeout, I expect that this code will not run.  However,
    # it does and it prints "Foobar".
    $m = $answer->message();
    print $m;
    alarm 0;

};
alarm 0;        
print "Done";

在服务器上放置一个睡眠(或断点),因此它不会响应,因此会触发警报。当警报触发时,将打印:

Foobar
Done

我的期望是打印:

Done

关键问题:

  • 为什么会这样?我使用某种反模式吗?使用警报,不是一个好主意,因为底层库也可能使用它们,它们可能会发生冲突吗?

  • 解决此问题的正确方法是什么?

附录1 - 我知道还有另一种方法......

我知道我应该使用:

$userAgent->timeout( ... ); 

实际上,我是。但是,我也想设置一个硬超时,这样我就可以确保最多花25秒等待请求。由于每次客户端从服务器返回某些内容时都会重置与$userAgent->timeout( ... );关联的超时,因此它不够可靠。

附录2 - 环境信息

@bolav提到在他的系统上,他无法重现这个问题,我猜它是可能的它是系统依赖的。

OS:

cat /etc/redhat-release 
CentOS release 6.6 (Final)

Perl版本:

This is perl, v5.6.1 built for i686-linux

附录3 - 关于建议使用此方法的SO的答案

0 个答案:

没有答案