Perl日記

PerlとかRubyとかPHPとかPythonとか

Parallel::ForkManagerを使ってみた

またまた「モダンPerl入門」より。
まったくもって勉強になる。
モダンPerl入門 (CodeZine BOOKS)
はてなブックマーク - 人気エントリー - テクノロジー」から人気エントリの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 エンタープライズ