1

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

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

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

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

4

1 回答 1

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 以了解有关您可以计算的输出和更多功能的详细信息。

- 迈克

于 2013-10-01T01:29:19.493 回答