IPC::Shareable

これが最適なモジュールかどうか、
もっとBestなモジュールがあれば教えてください。
ってのを前書きにおきますが、なんせIPC詳しくないので。
あと、まちがってたら突っ込みお願いします。

http://d.hatena.ne.jp/ablabo/20070327/1175008475

ここのBlogをみててforkしたときに変数が親プロセスと共通化できないよー
って話ですが、forkする場合はプロセスが完全に別物になるので
変数は当然別物になるです。

なのでこんな場合はIPC使うです。
IPCを自分で実装するの面倒なのでモジュール使うです。

サンプル

#!/usr/bin/perl
use strict;
use warnings;
use LWP::UserAgent;
use Parallel::ForkManager;
use IPC::Shareable;
use Data::Dumper;

my %Data;
tie %Data, 'IPC::Shareable', undef , { destroy => 1 };
$Data{'key'} = 'value';

my $MAX_PROCESSES = 10;
my $pm = new Parallel::ForkManager($MAX_PROCESSES);

my @urls = qw(
    http://d.hatena.ne.jp/nekokak/
    http://d.hatena.ne.jp/tokuhirom/
);

for my $url (@urls) {
  my $pid = $pm->start and next;

  my $ua = LWP::UserAgent->new();
  my $ans = $ua->head($url);

  print "##################\n";
  $Data{$url} = $ans->last_modified || 'Nothing';
  print Dumper(\%Data);
  print "##################\n";

  $pm->finish;
}

$pm->wait_all_children;

print "Dump Start.\n";
print Dumper(\%Data);
print "Dump End.\n";

%DataをIPC::Shareableでtieしてやるだけ。
簡単簡単。
でもオプションとかしらべてないから本気で使う場合はいろいろ調べてください。
http://search.cpan.org/dist/IPC-Shareable/lib/IPC/Shareable.pm

ちなみにプロセス間通信(IPC)については
Perlクックブックにものってるですね。
おいらちゃんと読んでないですが。

ちなみに多分うごかねーとかで何度もスクリプト実行してると思いますが、
その度にはてなとかLDにリクエストおくってて弾さんとかのBlogにアクセスするのは
行儀がよくないですね。
この場合、変数の値を確認するだけなので。
あと、IPC::Shareableを普通に入れようとしたらふんずまってうんともすんともいわなかったので
要注意。

Perlクックブック〈VOLUME2〉
トム クリスチャンセン ネイザン トーキントン Tom Christiansen Nathan Torkington Shibuya Perl Mongers ドキュメントシステム
オライリージャパン (2004/09)
売り上げランキング: 143882
おすすめ度の平均: 3.0
3 あまり使わない部分が集まってしまった下巻

Perlクックブック〈VOLUME1〉
トム クリスチャンセン ネイザン トーキントン Tom Christiansen Nathan Torkington Shibuya Perl Mongers ドキュメントシステム
オライリージャパン (2004/09)
売り上げランキング: 137776
おすすめ度の平均: 5.0
5 Perlプログラマ必携本(ご存知でしょうけど)