Как сделать 25 запросов одновременно с помощью HTTP::Async в Perl?

Я делаю много 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что-то делать, пока я обрабатываю записи, но также убедиться, что они не тайм-аут.

6
задан bodacydo 23 June 2012 в 20:43
поделиться