1

スクリプトを実行しており、並行して実行するようにフォークしました。

一部のプロセスは実行に時間がかかることに気付き、各プロセスの開始時と終了時を追跡したいと考えています。

現在、実行中に端末に時間を出力していますが、実行に時間がかかっているプロセスを特定するのは簡単ではありません。

Perl Parallel:ForkManager の使用中に追跡する方法はありますか?

4

1 に答える 1

2

実行中のプロセスに関するリアルタイムのフィードバックを探しているのか、それとも最後に 1 つの子がより長くかかったかを理解しようとしているだけなのかは不明です。最終結果を知りたいだけだとすると、次のようにすれば十分です。

Benchmark と、Parallel::ForkManager の run_on_finish コールバックを使用します。このようなものがうまくいくかもしれません。フォークしたプロセスの開始時刻を保存します。子プロセスが終了すると、Parallel::ForkManager は終了した pid で run_on_finish コールバックを呼び出します。次に、子の終了時間を保存し、ベンチマークで差を計算できます。

use Benchmark;
use Parallel::ForkManager;

my $max_forks = 5;

my $mgr = Parallel::ForkManager->new( $max_forks );

my %times;
$mgr->run_on_finish(sub {
    my $pid = shift;
    $times{$pid}->[1] = Benchmark->new; # end time mark
});

for ( 1 .. $max_forks+1 ) {  # N+1 to show that wait time isn't included.
    if (my $pid = $mgr->start) {  # Parent
        $times{$pid} = [Benchmark->new, undef]; #start time
        next;
    }

    srand(time^$$); # don't do this in real-world, perldoc srand
    my $sleep = int(rand(9));
    say "$$ sleeping $sleep";
    sleep ($sleep);
    $mgr->finish;
}

$mgr->wait_all_children;

foreach my $pid (keys %times) {
    say "Pid: $pid, ProcessTime: ", timestr(timediff($times{$pid}->[1], $times{$pid}->[0]));
}

計算できる出力とその他の関数の詳細については、Benchmark perldocs を参照してください。

- マイク

于 2013-10-01T01:29:19.493 に答える