2009-02-24 6 views

Antwort

10

Ich würde wahrscheinlich AnyEvent verwenden, vielleicht so:

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

Der Link zu AnyEvent :: HTTP ist http://search.cpan.org/~mlehmann/AnyEvent-HTTP/. – gpojd

3

I verwendet LWP::Parallel::UserAgent für etwas ähnliches. Ein Beispiel aus dem 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) = @_; .... } 
+0

LWP :: Parallel versagt seine Tests im Moment jedoch. –

+0

Ich denke, es ist nicht mehr gepflegt. Ich habe all meine Arbeit verschoben, um AnyEvent :: HTTP zu verwenden. – gpojd

3

HTTP::Async ist ziemlich schnell und sehr leicht zu Code.

+1

Entscheidend ist, dass es HTTP :: Response-Objekte zurückgibt, sodass Sie es anstelle von LWP fast schmerzfrei einfügen können. –

4

Eigentlich ist AnyEvent::Curl::Multi eine nicht blockierende Bibliothek, die auf libcurl aufgebaut ist. Sehr schnell und tonnenweise Nebenläufigkeit verfügbar. Viel mächtiger als AnyEvent :: HTTP, IMO.

Verwandte Themen