您之前在評論中詢問過此問題是關於按照與請求被放置,並且您發佈的代碼被從answer複製到該問題。因此,我認爲這也是你想要的。
接下來是不是最有效的解決方案,因爲沒有線程重用,但它可以很容易地收集你想要的順序的響應。
use threads;
use LWP::UserAgent qw();
my @urls = ...;
my $ua = LWP::UserAgent->new();
my @threads;
for (1..200) {
last if [email protected];
my $url = shift(@urls);
push @threads, async { $ua->get($url) };
}
while (@threads) {
my $thread = shift(@threads);
my $response = $thread->join;
if (@urls) {
my $url = shift(@urls);
push @threads, async { $ua->get($url) };
}
...
}
通過使用worker模式,您可以重用線程,以避免它需要啓動它們的時間。這也會按照您的要求收集回覆。
use threads;
use Thread::Queue 3.01 qw();
my $request_q = Thread::Queue->new();
my $response_q = Thread::Queue->new();
my @threads;
push @threads, async {
my $ua = LWP::UserAgent->new();
while (my $url = $request_q->dequeue()) {
$response_q->enqueue([ $url, $ua->get($url) ]);
}
};
$request_q->enqueue($_) for @urls;
$request_q->end();
my %responses;
for my $url (@urls) {
while (!$responses{$url}) {
my ($response_url, $response) = @{ $response_q->dequeue() };
$responses{$response_url} = $response;
}
my $response = delete($responses{$url});
...
}
$_->join for @threads;
也許你可以使用https://metacpan.org/release/ParallelUserAgent? –