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(); }