如果时间已过(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;
花时间)。