我需要在Perl中进行一些并发的XML feed请求。什么是最快的方法?
我需要在Perl中进行一些并发的XML feed请求。什么是最快的方法?
我可能会使用AnyEvent,像这样:
use AnyEvent;
use AnyEvent::HTTP;
sub get_feeds {
my @feeds = @_;
my $done = AnyEvent->condvar;
my %results;
$done->begin( sub { $done->send(\%results) } );
for my $feed (@feeds){
$done->begin;
http_get $feed, sub { $results{$feed} = \@_; $done->end };
}
$done->end;
return $done;
}
my $done = get_feeds(...);
my $result = $done->recv; # block until all feeds are fetched
实际上,AnyEvent::Curl::Multi 是建立在 libcurl 之上的非阻塞库。速度非常快,可用并发量也很大。在我看来,比 AnyEvent::HTTP 更加强大。
我曾经使用LWP::Parallel::UserAgent来完成类似的任务。以下是POD中的示例:
require LWP::Parallel::UserAgent;
$ua = LWP::Parallel::UserAgent->new();
...
$ua->redirect (0); # prevents automatic following of redirects
$ua->max_hosts(5); # sets maximum number of locations accessed in parallel
$ua->max_req (5); # sets maximum number of parallel requests per host
...
$ua->register ($request); # or
$ua->register ($request, '/tmp/sss'); # or
$ua->register ($request, \&callback, 4096);
...
$ua->wait ( $timeout );
...
sub callback { my($data, $response, $protocol) = @_; .... }