使用 perl 模块LWP::Simple时,是否有一种简单的方法来确定单个 getstore() 调用下载的速度和数量?这对于观察大文件下载的状态很有用。
在我的脑海中,一种方法是:
- 存储当前时间(time0)
- 在新进程中运行 getstore
- 轮询已知的目标文件
- 下载量将是当前文件大小(大小)
- 下载速度将(大小/ current_time - time0)
我想知道是否有更简单的方法。
欢迎提供替代建议(也许我应该使用不同的模块?)
使用 perl 模块LWP::Simple时,是否有一种简单的方法来确定单个 getstore() 调用下载的速度和数量?这对于观察大文件下载的状态很有用。
在我的脑海中,一种方法是:
我想知道是否有更简单的方法。
欢迎提供替代建议(也许我应该使用不同的模块?)
不要使用LWP::Simple
,而是直接使用LWP::UserAgent。首先,看看 LWP::Simple::getstore 如何初始化 $ua 并调用请求。你会想要调用$ua->add_handler
来指定一个response_data
处理程序来做你想做的任何事情;默认情况下(至少对于 HTTP 协议)LWP::UserAgent
将读取最多 4Kb 的块并response_data
为每个块调用处理程序,但您可以在请求方法参数中建议不同的大小。
如果您想区分标头数据和将存储在文件中的实际数据,或者在有重定向时做一些特殊的事情,您可能还想指定其他处理程序。
除非您有其他要求(例如在下载过程中查看速率和大小),否则您概述的步骤是最容易考虑和实施的。
您可以在 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 的活动” ,并展示了该技术的许多用途。