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.