2009-02-24 8 views

risposta

10

Io probabilmente usare AnyEvent, forse in questo modo:

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

Il collegamento a AnyEvent :: HTTP è http://search.cpan.org/~mlehmann/AnyEvent-HTTP/. – gpojd

3

ho usato LWP::Parallel::UserAgent per qualcosa di simile. Un esempio dal 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 non supera i test al momento, però. –

+0

Penso che non sia più mantenuto. Ho spostato tutto il mio lavoro per utilizzare AnyEvent :: HTTP. – gpojd

3

HTTP::Async è abbastanza veloce e molto facile da codice.

+1

In modo cruciale, restituisce oggetti HTTP :: Response, in modo da poterlo inserire in modo quasi indolore al posto di LWP. –

4

In realtà, AnyEvent::Curl::Multi è una libreria non bloccante costruita su libcurl. Molto veloce e tonnellate di concorrenza disponibili. Molto più potente di AnyEvent :: HTTP, IMO.