如何从LWP :: Simple的getstore()确定下载速度和数量?

时间:2009-11-22 07:22:16

标签: perl downloading lwp

使用perl模块LWP::Simple时,有一种简单的方法可以确定单个getstore()调用下载的速度和数量吗?这对于观察大文件下载的状态非常有用。

脱离我的头脑,一种方法是:

  1. 存储当前时间(time0)
  2. 在新流程中运行getstore
  3. 轮询已知的目标文件
    • 下载的数量将是当前文件大小(大小)
    • 下载速度将是(size / current_time - time0)
  4. 我想知道是否有更简单的方法。

    欢迎备选建议(也许我应该使用不同的模块?)

2 个答案:

答案 0 :(得分:7)

不使用LWP::Simple,而是直接使用LWP::UserAgent。首先,看看LWP :: Simple :: getstore如何初始化$ ua并调用请求。您需要调用$ua->add_handler来指定response_data处理程序来执行您想要的任何操作;默认情况下(至少对于HTTP协议)LWP::UserAgent将读取4Kb块并为每个块调用response_data处理程序,但您可以在请求方法参数中建议不同的大小。

如果要区分标题数据和将存储在文件中的实际数据,或者如果存在重定向,请执行特殊操作,您可能还需要指定其他处理程序。

答案 1 :(得分:4)

除非您有其他要求(例如在下载过程中观察速率和大小),否则您概述的步骤最容易思考和实施。

您可以在LWP :: Simple中导出基础用户代理对象。如果您只想观看一次性下载,可以设置用户代理的show_progress位:

 use LWP::Simple qw($ua getstore);

 $ua->show_progress(1);

 getstore( 
'http://www.theperlreview.com/Issues/subscribers.html',
'subscribers.html'
);

要做更多的工作,你可以使用LWP :: Simple并仍然执行same thing ysth suggests

 use LWP::Simple qw($ua);

 $ua->response_header( 
      sub { 
          my($response, $ua, $h) = @_; 
          ... 
          }
      );

在该子程序中,您可以读取数据并随意执行任何操作,包括保留计时器。得到答案后,您可以删除该位代码,然后返回getstore

Flavio Poletti为The Perl Review, Spring 2009撰写了“观看LWP的活动”,并展示了该技术的许多用途。