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});
...
}