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 outn" };
            alarm 2;
            print $fh $chunk;
            alarm 0;
        };
        # ...
    },
);
close $fh;

如果为块调用'content_cb'回调,则表示该块已成功从请求返回。LWP::UserAgent层在这一点上已经完成了它的工作(相对于该块)。然后,您的程序负责对块执行任何操作。 LWP::UserAgent不知道你的程序如何设置或处理系统信号,所以它不可能重做任何请求,或者重新通知你的程序任何块,以响应系统信号或程序上下文中发生的任何其他事件(这在LPW::UserAgent上下文之外)。

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

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

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

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

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

相关内容

  • 没有找到相关文章

最新更新