我正在执行一个脚本,并将其分叉并运行。
我注意到某些进程需要更多时间来执行,并希望在每个进程开始和结束时跟踪它们。
现在,我正在执行时将时间打印到终端,但不容易确定哪个进程需要时间来执行。
有没有办法在使用Perl Parallel时跟踪它:ForkManager?
答案 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。
- 迈克