Jak zrobić 25 żądań jednocześnie za pomocą HTTP :: Async w Perlu?

Wykonuję wiele żądań HTTP i wybrałem HTTP :: Async, aby wykonać zadanie. Mam ponad 1000 próśb do wykonania, a jeśli po prostu wykonam następujące czynności (zobacz poniższy kod), wiele żądań upłynie przed przetworzeniem, ponieważ przetwarzanie może zająć dziesiątki minut:

for my $url (@urls) {
    $async->add(HTTP::Request->new(GET => $url));
}
while (my $resp = $async->wait_for_next_response) {
    # use $resp
}

Postanowiłem więc wykonać 25 żądań na czas, ale nie mogę wymyślić sposobu na wyrażenie tego w kodzie.

Próbowałem:

while (1) {
    L25:
    for (1..25) {
        my $url = shift @urls;
        if (!defined($url)) {
            last L25;
        }
        $async->add(HTTP::Request->new(GET => $url));
    }
    while (my $resp = $async->wait_for_next_response) {
        # use $resp
    }
}

To jednak nie działa dobrze, ponieważ teraz jest zbyt wolne. Teraz czeka, aż wszystkie 25 żądań zostanie przetworzone, dopóki nie doda kolejnych 25. Jeśli więc pozostały 2 żądania, nic nie robi. Muszę poczekać na przetworzenie wszystkich żądań, aby dodać kolejną partię 25.

Jak mogę poprawić tę logikę?$async zrób coś podczas przetwarzania rekordów, ale upewnij się, że nie tracą czasu.

questionAnswers(2)

yourAnswerToTheQuestion