我正在编写一个Perl脚本,它接收URL列表并检查它们是否存在。(请注意,我只关心它们的存在;我不在乎它们的内容。这是这个项目的重要部分。
use LWP::Simple qw($ua head);
if (head($url))
{
$numberAlive ++;
}
else
{
$numberDead ++;
}现在,该程序运行良好;但是,我希望它运行得更快。因此,我正在考虑使它成为多线程。我假设程序的慢部分是为每个URL与服务器联系;因此,我正在寻找一种方法,在等待第一个响应时,可以向列表中其他网页的URL发送请求。我该怎么做?据我所知,head例程没有回调,一旦服务器响应,就可以调用回调。
发布于 2012-07-22 07:58:03
另一个选项是HTTP::异步。
#!/usr/bin/perl
use strict;
use warnings;
use HTTP::Request;
use HTTP::Async;
my $numberAlive = 0;
my $numberDead = 0;
my @urls = ('http://www.perl.com','http://www.example.xyzzy/foo.html');
my $async = HTTP::Async->new;
# you might want to wrap this in a loop to deal with @urls in batches
foreach my $url (@urls){
$async->add( HTTP::Request->new( HEAD => $url ) );
}
while ( my $response = $async->wait_for_next_response ) {
if ($response->code == 200){$numberAlive ++;}
else{$numberDead ++;}
}
print "$numberAlive Alive, $numberDead Dead\n";发布于 2012-07-22 06:36:06
基于工作人员的并行化(使用您选择的线程或进程):
use strict;
use warnings;
use feature qw( say );
use threads; # or: use forks;
use LWP::Simple qw( head );
use Thread::Queue::Any qw( );
use constant NUM_WORKERS => 10; # Or whatever.
my $req_q = Thread::Queue::Any->new();
my $resp_q = Thread::Queue::Any->new();
my @workers;
for (1..NUM_WORKERS) {
push @workers, async {
while (my $url = $req_q->dequeue()) {
my $is_alive = head($url) ? 1 : 0;
$resp_q->enqueue($is_alive);
}
};
}
$req_q->enqueue($_) for @urls;
my ($alive, $dead);
for (1..@urls) {
my $is_alive = $resp_q->dequeue();
++( $is_alive ? $alive : $dead );
}
$req_q->enqueue(undef) for @workers;
$_->join for @workers;
say $alive;
say $dead;https://stackoverflow.com/questions/11596203
复制相似问题