ひょんなことから、並列処理が必要とされる場面があったので Parallel::ForkManager
とやらを使ってみた
このモジュールを選定した理由は、threads か Parallel::ForkManager で迷ったが、使っている perlbrew では threads が使えなかったため今回は、Parallel::ForkManager を使用しました
ちなみに threads とは、いい感じにマルチスレッドを扱えるクラスです
では、Parallel::ForkManager の使い方を書いていきます
導入
cpanm Parallel::ForkManager
いつも通り cpanmコマンドでモジュールを入れちゃいましょう
実装
サンプルコードを載せておきます
#!/usr/bin/perl use strict; use warnings; use feature 'say'; use Parallel::ForkManager; my $methods = [ 'hoge', 'foo', 'bar', ]; my $pm = new Parallel::ForkManager->new(3); # 子プロセスの最大値を指定し、オブジェクトを生成する for my $method (@$methods) { $pm->start and next; # forkする if ($method eq 'hoge') { &hoge; } elsif ($method eq 'bar') { &bar; } elsif ($method eq 'foo') { &foo; } $pm->finish; # 子プロセスを kill する } $pm->wait_all_children; # 子プロセスの終了を待つ say "finish"; sub hoge { sleep(3); say "hoge"; } sub bar { say "bar"; } sub foo { sleep(5); say "foo"; }
結果
期待される出力順は、bar → hoge → foo の順ですが・・・
$ perl test.pl bar hoge foo finish
期待通りの動作でした
こんな感じで簡単にプロセスを fork し並列処理をすることが可能です
今回は基本的なことしかしていませんが、今後もっと触っていきたいですねー