私が取り組んでいるプロジェクトの一部に対してForkManagerを適切に実装する方法を理解しようとしていますが、FMがプロセスの作成や処理を行っているようですが、永遠に。ForkManagerはデバッグモードで素早く終了します
しかし、デバッグコードでFMを試してみると(最大プロセスを0に設定すると)、コードは妥当で予想された時間枠内で完了します。ここで
私はとのトラブルを抱えていたコード...だから私は0に$cpu_count
を設定している場合
use strict;
use warnings;
use Parallel::ForkManager;
sub read_table {
# takes a filename and reads in a CSV file.
# works fine and thus is omitted here
}
sub foo {
# originally an Inline::C subroutine
# for purpose of debugging replaced with randgen
return rand;
}
my $cpu_count = 0; my $epsilon = 1e-16;
my @tt = read_table('tt.csv');
my @tc = read_table('tc.csv');
my @nm = ($epsilon) x scalar @tc;
my @results;
my $pm = new Parallel::ForkManager($cpu_count);
$pm->run_on_finish(sub{
my $i = $_[1]; my $m = $_[5];
$results[$i] = $m;
});
foreach my $i (0..$#tt) {
$pm->start and next;
my @r;
if (scalar @{$tt[$i]} > 1) {
foreach my $j (0..$#tc) {
if (scalar @{$tc[$j]} > 1) {
push @r, foo(scalar @{$tt[$i]}, scalar @{$tc[$j]}, \@{$tt[$i]}, \@{$tc[$j]});
} else {
push @r, $epsilon;
}
}
} else {
@r = @nm;
}
$pm->finish($i, [@r]);
undef @r;
}
$pm->wait_all_children;
あり、このプロセスは数分で完了し、元のCコードで、問題なく細かい完了します(sub foo {return rand;}
は〜2秒しかない)が、FMがオンになっていると、長い時間続くように見える。しかし、私がprint "at rows $i and $j"
のような印刷文を入れて問題を診断すると、実行中のように見えました。
すべてのFM関連コードを取り出して、代わりに通常の二重foreachループを使用しようとすると、ランタイムは同じでした。
ありがとうございます!
子から親に送信されたデータがディスクに書き込まれているため