3スレッドでダウンロードを並列して行いたい。スレッドの queue を使って解決できた
use strict;
use warnings;
use threads;
use threads::shared;
use Thread::Queue;
use LWP::UserAgent;
# ダウンロード queue を生成する
my @download_list = (
"http://example.com/example1.hoge",
"http://example.com/example2.hoge",
"http://example.com/example3.hoge",
"http://example.com/example4.hoge",
"http://example.com/example5.hoge",
"http://example.com/example6.hoge",
"http://example.com/example7.hoge",
"http://example.com/example8.hoge",
"http://example.com/example9.hoge",
);
# $queue をスレッド間で共有できるようにする
my $queue:shared = Thread::Queue->new();
# @download_list を enqueue する
$queue->enqueue(@download_list);
# スレッドを 3 つ作る
for (1..3) {
# このループの中でほぼ同時に3スレッドが生成される
threads->create(
sub {
my $ua = LWP::UserAgent->new();
# queue がなくなるまで dequeue し続ける
# ここで重要な点は、 $queue がスレッド間で共有されていて、
# 各スレッドがダウンロード終了し次第、共有されている queue から dequeue してくる
while(my $url = $queue->dequeue_nb()) {
$url =~ m{ /(\w+.hoge) }xms;
print "Downloading:$url\n";
$ua->get($url, ":content_file" => "./dl/$1");
print "Complete:$url\n";
}
}
);
}
# 動いているスレッドを join して、全てのスレッドが終了するまで待つ
for (threads->list()) {
$_->join();
}