上京エンジニアの葛藤

都会に染まる日々

Parallel::ForkManager を使って並列処理してみた

ひょんなことから、並列処理が必要とされる場面があったので Parallel::ForkManager とやらを使ってみた

このモジュールを選定した理由は、threads か Parallel::ForkManager で迷ったが、使っている perlbrew では threads が使えなかったため今回は、Parallel::ForkManager を使用しました

ちなみに threads とは、いい感じにマルチスレッドを扱えるクラスです

perldoc.jp

では、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 し並列処理をすることが可能です

metacpan.org

今回は基本的なことしかしていませんが、今後もっと触っていきたいですねー