Queueの管理で並列ダウンロード

3スレッドでダウンロードを並列して行いたい。スレッドのキューを使って解決できた

use strict;
use warnings;
use threads;
use threads::shared;
use Thread::Queue;
use LWP::UserAgent;

# ダウンロードキューを生成する
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 をエンキューする
$queue->enqueue(@download_list);

# スレッドを3つ作る
for(1..3)
{
    # このループの中でほぼ同時に3スレッドが生成される
    threads->create(
        sub
        {
            my $ua = LWP::UserAgent->new();
            
            # キューがなくなるまでデキューし続ける
            # ここで重要な点は、 $queue がスレッド間で共有されていて、
            # 各スレッドがダウンロード終了し次第、共有されているキューからデキューしてくる。
            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 して、全てのスレッドが終了するまで待つ
foreach (threads->list()) {
    $_->join();
}