我正在做很多 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
来做一些事情,同时还要确保它们不会超时。