LWP :: UserAgent在超时时获得回调

时间:2015-03-16 07:11:48

标签: perl callback timeout lwp-useragent

如果时间超时(2秒),是否会使用此代码丢失块,或者get是否重试下载丢失的块?

use LWP::UserAgent;

my $url = '...';
my $file_name = '...';
my $ua = LWP::UserAgent->new();

open my $fh, '>>:raw', $file_name or die $!;
my $res = $ua->get( 
    $url,
    ':content_cb' => sub {
        my ( $chunk, $res, $proto ) = @_;
        eval {
            local $SIG{ALRM} = sub { die "time out\n" };
            alarm 2;
            print $fh $chunk;
            alarm 0;
        };
        # ...
    },
);
close $fh;

2 个答案:

答案 0 :(得分:1)

如果为块调用'content_cb'回调,则表示已从请求成功返回块。 LWP::UserAgent层已在此时完成其工作(相对于该块)。然后你的程序负责对块进行任何操作。 LWP::UserAgent不知道您的程序如何设置或处理系统信号,因此它无法重做任何请求,或者为了响应系统信号或任何其他事件而重新通知您的程序任何块在你的程序的上下文中继续(并且在LPW::UserAgent的上下文之外)。

此外,应该提到的是,即使您设置LWP::UserAgent timeout属性,该属性适用于挂起的服务器活动(例如响应请求,或发送下一个块),然后LWP::UserAgent甚至不会在这种超时的情况下重新发送请求。在任何情况下,该模块都没有被设计成这样做:

  

如果在超时秒内没有观察到与服务器的连接上的活动,则中止请求。

如果发生任何类型的超时,或者如果您的代码认为它没有从服务器收到足够的响应数据,您始终可以在代码中重新发送请求。

答案 1 :(得分:1)

如果您担心超时,请使用timeout method。 在您的代码中,当一大块数据到达时,LWP :: UserAgent会调用您的':content_cb'回调,并且不会重试。

IMO没有办法以这种方式处理超时,因为它永远不会发生(除非print $fh $chunk;花费时间)。