2011-12-04 65 views
4

使用Perl,我正在尋找一種簡單的方法來並行地執行HTTP請求,在那裏我得到答覆回來我給他們後,以相同的順序極少數,他們完全的,例如:如何在Perl中創建並行HTTP請求,並按順序接收它們?

my ($google, $perl) = foobar(GET => 'http://www.google.com/', 
          GET => 'http://www.perl.org/'); 

有我應該看一個模塊?

我知道我可以手工做記賬,但是使用jQuery's when method就能做到這一點,我感到被寵壞了,我很想用一個簡單的Perl解決方案。

感謝您的幫助。

+0

FWIW:我只是試圖讓LWP ::在過去的兩個小時裏並行工作,一直拉着我的頭髮。我不*推薦LWP :: Parallel。它看起來非常麻煩,缺乏API和文檔。 – jlh

回答

13
use threads; 
use LWP::UserAgent qw(); 

my $ua = LWP::UserAgent->new(); 
my @threads; 
for my $url ('http://www.google.com/', 'http://www.perl.org/') { 
    push @threads, async { $ua->get($url) }; 
} 

for my $thread (@threads) { 
    my $response = $thread->join; 
    ... 
} 

最好的部分是,家長不等待完成的所有請求。只要正確的請求完成,父母將解除封鎖處理它。


如果您使用Parallel::ForkManager或別的東西,你不能等待一個特定的孩子,你可以使用下面的代碼命令的結果:

for my $id (0..$#urls) { 
    create_task($id, $urls[$id]); 
} 

my %responses; 
for my $id (0..$#urls) { 
    if (!exists($responses{$id})) { 
     my ($id, $response) = wait_for_a_child_to_complete(); 
     $responses{$id} = $response; 
     redo; 
    } 

    my $response = delete($responses{$id}); 
    ... 
} 
+0

Parallel :: ForkManager示例如何呢? – ysth

+1

@ysth,P :: FM的要點是與固定大小的工作人員合作。這對共享CPU很有用。在這種情況下,OP希望儘可能多的工人都會睡覺等待IO。 (如果你想要進程而不是線程,改變'使用線程';'使用分支;'。) – ikegami

+0

@ysth,增加了一個你可以在P :: FM中使用的排序算法。 – ikegami

10

我是Mojo的粉絲! 從Mojo::UserAgent文檔:

use Mojo; 
use Mojo::UserAgent; 
# Parallel requests 
my $ua = Mojo::UserAgent->new; 
$ua->max_redirects(5); 
my $delay = Mojo::IOLoop->delay; 
for my $url ('http://www.google.com/', 'http://www.perl.org/') { 
    $delay->begin; 
    $ua->get($url => sub { 
    my ($ua, $tx) = @_; 
    $delay->end($tx->res->dom); 
    }); 
} 
my @responses = $delay->wait; 
print join "\n", @responses 

享受!

編輯

順便說一句。你不必處理在最後的答覆,你可以做在之間:

# ... 
$ua->get($url => sub { 
    my ($ua, $tx) = @_; 
    $delay->end(1); 
    # process $tx->res here 
}); 
# ... 
$delay->wait; 
+1

今年我有一個像[Perl Advent Calendar](http://perladvent.org)這樣的條目,但我不知道它會在哪一天。 –

+0

@brian d foy,在esskar的解決方案中,父母在開始處理回覆之前等待的時間比所需時間長得多。這可以簡單地修復嗎? – ikegami

相關問題