gpt4 book ai didi

perl - 我如何在 Perl 中使用 HTTP::Async 一次发出 25 个请求?

转载 作者:可可西里 更新时间:2023-11-01 15:17:42 24 4
gpt4 key购买 nike

我正在执行大量 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 在我处理记录的同时做一些事情,同时确保它们不会超时。

最佳答案

你很接近,你只需要结合这两种方法! :-)

未经测试,所以将其视为伪代码。特别是我不确定 total_count 是否是正确的使用方法,文档没有说明。您也可以只使用一个 $active_requests 计数器,在添加请求时使用 ++ 并在收到响应时使用 --

while (1) {

# if there aren't already 25 requests "active", then add more
while (@urls and $async->total_count < 25) {
my $url = shift @urls;
$async->add( ... );
}

# deal with any finished requests right away, we wait for a
# second just so we don't spin in the main loop too fast.
while (my $response = $async->wait_for_next_response(1)) {
# use $response
}

# finish the main loop when there's no more work
last unless ($async->total_count or @urls);

}

关于perl - 我如何在 Perl 中使用 HTTP::Async 一次发出 25 个请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11172831/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com