sirosiro46hgrのブログ

sirosiro46hgrのブログ

ブログの説明を入力します。

Amebaでブログを始めよう!
知らない人が見たら、なんのこっちゃってタイトルですが。
自分用の備忘録なのでご勘弁を。

参考URL
https://gist.github.com/riywo/1596357

やりたいことがまんま書いてあるページw

まず、Perlでforkというと、
いろいろあるのでしょうがお客の指示により、
Parallel::ForkManager
であることは決定しておりました。
その前にforkとは、
簡単に言えば、起動したプログラムとは別のプロセスを起動すること。
何が良いかといえば、割り当てられるCPUが別モノになるので、
同時進行で処理が解決でき、処理時間が短くなるのが本来の目的。


では、簡単にParallel::ForkManagerを。

http://perldoc.jp/docs/modules/Parallel-ForkManager-0.7.5/ForkManager.pod

を参考に、もっともシンプルなソースを書くと、

# インスタンス化
my $pm = Parallel::ForkManager->new(1);
# fork
my $pid = $pm->start and next;
# 子プロセス処理
printf("pid = %s\n", $pid);
# 子プロセスの終了
$pm->finish();
# 子プロセスの終了待ち合わせ
$pm->wait_all_children;

こんな感じ。全くforkの恩恵ないけどww
処理を早くしたい場合は、fork やら thread などを用いて、
並列処理させる(できない場合も当然ありますが)のが有効だと分かりますが、
弱点も勿論あります。大きく2つ。
・子供たちが勝手に動き出すので親の管理が面倒になること。(育児の話ではないw)
・子供たちは独り立ちして別プロセスとなるので基本的に直接のやりとりができないこと。

おー、2番目の問題は困る場合あるのではないでしょうか。
せっかく分散させたけど、結果を受け取れないって・・・

ということで、タイトルに戻り、
その親子の会話をpipeが取り持とうじゃないか、っというお話。

上のソースに少し足しましょう。


# インスタンス化
my $pm = Parallel::ForkManager->new(1);
my @pipes = map { IO::Pipe->new } (1..2);

# fork
my $pid = $pm->start and next;
# 使用するパイプ
my $pipe = $pipes[0]->writer;

# 子プロセス処理
my $i = 10;
my $json = encode_json({
'ret' => $i++
,'pid' => $pid});
printf( $pipe "json\n");

# 子プロセスの終了
$pm->finish();
# 子プロセスの終了待ち合わせ
$pm->wait_all_children;

# 親プロセスで取得
$pipe = $pipes[0]->reader;
while(<$pipe>) {
chomp;
my $data = decode_json($_);
printf ("ret=[%s], pid=[%s]\n", $data->{ret}, $data->{pid});
}

でいけるらしい。
まだ試してないけどw