動画ダウンローダー(マルチスレッドのお勉強その2)
マルチスレッドの勉強のためにちょこちょこ作ってみた。
色々甘いし、Thread::Queueとか使ってないので構造的にも変だけど、一応動くのでアップ。
d.pl
use strict; use threads; use WWW::Mechanize; use LWP::Simple; my $ua = WWW::Mechanize->new; $ua->get('http://www.google.co.jp/'); $ua->set_visible('http://galleries1.givemeanime.com/'); $ua->click; my @link = map { $_->url_abs } $ua->find_all_links(url_abs_regex=>qr/^http:\/\/galleries1\.givemeanime\.com/); foreach my $link ( @link ) { print $link; print "\n"; $ua->get($link); my @movie = map { $_->url_abs } $ua->find_all_links(url_abs_regex=>qr/mpg$/i); map { print "\t$_\n" } @movie; my @result = map { threads->new(\&download, $_) } @movie; } while ( my @list = threads->list ) { print join ( '/', map { $_->tid } @list ); print "\n"; sleep 1; } sub download { my $url = shift; my ( $file, $path ) = (reverse (split /\//, $url))[0..1]; -d $path or mkdir $path; my $long_file = $path.'/'.$file; print "start download : $long_file\.\n"; getstore($url, $long_file); print "end download : $long_file\.\n"; threads->detach(); }
感想
detachとかjoinとかの使い方がわかった。threads->tidとかは、スレッドの中でこそ使うものなんだね。引数無しでクラスメソッドとして実行すれば、クラスメソッドの中で呼び出したスレッドを判別して処理してくれる訳だ。どんな仕組みだろう。