Parallel::ForkManagerを使ってみた
またまた「モダンPerl入門」より。
まったくもって勉強になる。
「はてなブックマーク - 人気エントリー - テクノロジー」から人気エントリのRSSを取得して、最大5個の子プロセスで、タイトルとプックマーク件数をmemcachedに格納するスクリプト書いた。
#!/usr/local/bin/perl # b_hatena_it.pl use strict; use warnings; use 5.010; use Parallel::ForkManager; use LWP::Simple qw(get); use XML::Simple; use Encode qw(encode); use Memcached; # 前作ったやつ #use Data::Dumper qw(Dumper); # はてブ コンピュータ・IT RSS my $xml_uri = 'http://b.hatena.ne.jp/hotentry/it.rss'; my $xml = get($xml_uri) or die "Can't get [$xml_uri]"; my $parser = XML::Simple->new; my $data = $parser->XMLin($xml); # はてなブックマーク件数取得API my $b_api = 'http://api.b.st-hatena.com/entry.count?url='; #print Dumper($data); # 最大5プロセスまでfork my $pm = Parallel::ForkManager->new(5); KVS : for my $item (@{$data->{item}}) { $pm->start and next KVS; eval { # say encode('utf8', $item->{title}); # say get($b_api.$item->{link}).' bookmark'; my $title = encode('utf8', $item->{title}); my $bookmark_num = get($b_api.$item->{link}) || 0; my $mem = Memcached->new; $mem->set($title, $bookmark_num); }; $pm->finish; } __END__
計測するの忘れたけどforkした方がやっぱり早いな。
まあその分負担かけてるしかけちゃっているのだけれど。
参考:
はてなブックマーク件数取得APIとは - はてなキーワード作って学ぶ、今どきのWebサービス:第3回 XML::SimpleであらゆるXML文書を料理する (1/2) - ITmedia エンタープライズ