HTTPでのファイルダウンロードを並列に実行する
HTTP::Asyncモジュールを使うとHTTPリクエストを並列に実行することができます。
Parallel::ForkManagerモジュールを使うと処理を並列に実行することができるので、HTTPリクエスト処理を記述することでHTTPリクエストを並列に実行することができます。
use strict; use warnings; use HTTP::Async; use HTTP::Request; use URI; my @uris = qw( http://www2u.biglobe.ne.jp/~MAS/image/fractal/gallery21-25/g21-01.jpg http://www2u.biglobe.ne.jp/~MAS/image/fractal/gallery21-25/g21-02.jpg http://www2u.biglobe.ne.jp/~MAS/image/fractal/gallery21-25/g21-03.jpg http://www2u.biglobe.ne.jp/~MAS/image/fractal/gallery21-25/g22-01.jpg http://www2u.biglobe.ne.jp/~MAS/image/fractal/gallery21-25/g22-02.jpg http://www2u.biglobe.ne.jp/~MAS/image/fractal/gallery21-25/g22-03.jpg http://www2u.biglobe.ne.jp/~MAS/image/fractal/gallery21-25/g23-01.jpg http://www2u.biglobe.ne.jp/~MAS/image/fractal/gallery21-25/g23-02.jpg http://www2u.biglobe.ne.jp/~MAS/image/fractal/gallery21-25/g23-03.jpg ); my $async = HTTP::Async->new( slots => 3, # 同時実行リクエスト数 ); foreach my $uri (@uris) { $async->add( HTTP::Request->new(GET => $uri) ); } while (my $res = $async->wait_for_next_response) { print $res->request->uri, "\n"; if ($res->is_success) { my $uri = URI->new($res->request->uri); my $path = $uri->path; # リクエストしたURIのパス my $file = (substr $path, -1) ne '/' ? (split /\//, $path)[-1] # 最後の/以降の文字を取得 : 'index.html'; # 最後が/の場合はindex.html open my $fh, ">", $file or warn "$!:$file"; binmode $fh; print $fh $res->content; close $fh; } else { warn $res->status_line; } }
use strict; use warnings; use Parallel::ForkManager; use LWP::Simple; use URI; my @uris = qw( http://www2u.biglobe.ne.jp/~MAS/image/fractal/gallery21-25/g21-01.jpg http://www2u.biglobe.ne.jp/~MAS/image/fractal/gallery21-25/g21-02.jpg http://www2u.biglobe.ne.jp/~MAS/image/fractal/gallery21-25/g21-03.jpg http://www2u.biglobe.ne.jp/~MAS/image/fractal/gallery21-25/g22-01.jpg http://www2u.biglobe.ne.jp/~MAS/image/fractal/gallery21-25/g22-02.jpg http://www2u.biglobe.ne.jp/~MAS/image/fractal/gallery21-25/g22-03.jpg http://www2u.biglobe.ne.jp/~MAS/image/fractal/gallery21-25/g23-01.jpg http://www2u.biglobe.ne.jp/~MAS/image/fractal/gallery21-25/g23-02.jpg http://www2u.biglobe.ne.jp/~MAS/image/fractal/gallery21-25/g23-03.jpg ); my $max_process = 3; # 同時実行リクエスト数 my $pm = Parallel::ForkManager->new($max_process); foreach my $uri (@uris) { $pm->start and next; my $path = URI->new($uri)->path; # リクエストURIのパス my $file = (substr $path, -1) ne '/' ? (split /\//, $path)[-1] # 最後の/以降の文字を取得 : 'index.html'; # 最後が/の場合はindex.html mirror($uri, $file); print $uri, "\n"; $pm->finish; } $pm->wait_all_children;