私は多くの 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
}
ということで、1回あたり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
、レコードの処理中に何かを実行できるようにするにはどうすればよいでしょうか。また、レコードがタイムアウトしないようにすることもできます。