在Perl中,最快的并发Web请求方法是什么?

6

我需要在Perl中进行一些并发的XML feed请求。什么是最的方法?


4
你的意思是最快指的是:一个最快能够实现的解决方案,还是一个一旦实施就最快的解决方案? - Marcus
4个回答

10

我可能会使用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

1
AnyEvent::HTTP的链接是http://search.cpan.org/~mlehmann/AnyEvent-HTTP/. - gpojd

4

实际上,AnyEvent::Curl::Multi 是建立在 libcurl 之上的非阻塞库。速度非常快,可用并发量也很大。在我看来,比 AnyEvent::HTTP 更加强大。


4

1
关键是,它返回HTTP :: Response对象,因此您可以几乎无痛地将其插入到LWP的位置。 - Sam Kington

3

我曾经使用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) = @_; .... }

LWP::Parallel目前测试失败。 - Sam Kington
我认为它已经不再维护了。我将所有的工作都转移到使用AnyEvent::HTTP上了。 - gpojd

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接