Wie kann ich mit HTTP :: Async in Perl jeweils 25 Anfragen stellen?

Ich mache viele HTTP-Anfragen und habe HTTP :: Async ausgewählt, um den Job zu erledigen. Ich habe über 1000 Anfragen zu stellen, und wenn ich einfach Folgendes tue (siehe Code unten), läuft eine Menge Anfragen ab, bis sie verarbeitet werden, da es einige zehn Minuten dauern kann, bis sie verarbeitet werden:

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

Also habe ich mich entschlossen, 25 Anfragen pro Mal zu stellen, aber mir fällt keine Möglichkeit ein, dies in Code auszudrücken.

Ich habe folgendes versucht:

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
    }
}

Dies funktioniert jedoch nicht gut, da es jetzt zu langsam ist. Jetzt wird gewartet, bis alle 25 Anforderungen verarbeitet wurden, bis weitere 25 hinzugefügt wurden. Wenn also noch 2 Anforderungen vorhanden sind, wird nichts ausgeführt. Ich muss warten, bis alle Anforderungen verarbeitet wurden, um die nächste Charge von 25 hinzuzufügen.

Wie könnte ich diese Logik verbessern, um zu machen$async Mach etwas, während ich Aufzeichnungen verarbeite, aber achte auch darauf, dass sie keine Zeitüberschreitung verursachen.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage