Я делаю много HTTP-запросов и выбрал HTTP::Async для выполнения этой работы. Я должен сделать более 1000 запросов, и если я просто сделаю следующее (см. код ниже), время ожидания многих запросов истекает к моменту их обработки, поскольку обработка может занять десятки минут:
for my $url (@urls) {
$async->add(HTTP::Request->new(GET => $url));
}
while (my $resp = $async->wait_for_next_response) {
# use $resp
}
Поэтому я решил делать 25 запросов за раз, но не могу придумать, как выразить это в коде.
Я пробовал следующее:
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
}
}
Это, однако, работает не очень хорошо, потому что теперь оно слишком медленное. Теперь он ждет, пока все 25 запросов не будут обработаны, пока не добавит еще 25. Поэтому, если у него осталось 2 запроса, он ничего не делает. Я должен дождаться обработки всех запросов, чтобы добавить следующую партию из 25.
Как я могу улучшить эту логику, чтобы заставить $async
что-то делать, пока я обрабатываю записи, но также убедиться, что они не тайм-аут.