2

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

在我的脑海中,一种方法是:

  1. 存储当前时间(time0)
  2. 在新进程中运行 getstore
  3. 轮询已知的目标文件
    • 下载量将是当前文件大小(大小)
    • 下载速度将(大小/ current_time - time0)

我想知道是否有更简单的方法。

欢迎提供替代建议(也许我应该使用不同的模块?)

4

2 回答 2

7

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

如果您想区分标头数据和将存储在文件中的实际数据,或者在有重定向时做一些特殊的事情,您可能还想指定其他处理程序。

于 2009-11-22T07:57:51.447 回答
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 并且仍然执行ysth 建议的相同操作

 use LWP::Simple qw($ua);

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

在该子例程中,您读取数据并使用它做任何您喜欢的事情,包括保持一个计时器。得到答案后,您可以删除那段代码并返回getstore.

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

于 2009-11-22T22:32:44.853 回答