每个分叉进程perl的执行时间

时间:2013-10-01 00:21:19

标签: perl parallel-processing fork perl-module

我正在执行一个脚本,并将其分叉并运行。

我注意到某些进程需要更多时间来执行,并希望在每个进程开始和结束时跟踪它们。

现在,我正在执行时将时间打印到终端,但不容易确定哪个进程需要时间来执行。

有没有办法在使用Perl Parallel时跟踪它:ForkManager?

1 个答案:

答案 0 :(得分:2)

目前还不清楚您是否正在寻找有关正在运行的流程的实时反馈,或者您是否只是想了解一个孩子最后是否需要更长时间。假设您只想知道最终结果,以下就足够了:

使用Benchmark和Parallel :: ForkManager的run_on_finish回调。这样的事可能适合你。我们分叉时存储分叉进程的开始时间。当子进程退出时,Parallel :: ForkManager将使用退出的pid调用run_on_finish回调。然后,您可以存储孩子的结束时间,然后使用Benchmark计算差异。

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。

- 迈克