我正在执行一个脚本并将其分叉以并行运行。
我注意到一些进程需要更多时间来执行,并且希望跟踪每个进程的开始和结束时间。
现在,我在执行时将时间打印到终端,但要确定哪个进程需要时间来执行并不容易。
有没有办法在使用 Perl Parallel:ForkManager 时跟踪它?
我正在执行一个脚本并将其分叉以并行运行。
我注意到一些进程需要更多时间来执行,并且希望跟踪每个进程的开始和结束时间。
现在,我在执行时将时间打印到终端,但要确定哪个进程需要时间来执行并不容易。
有没有办法在使用 Perl Parallel:ForkManager 时跟踪它?
目前尚不清楚您是否正在寻找有关正在运行的流程的实时反馈,或者您是否只是想了解一个孩子最终是否花费了更长的时间。假设您只想知道最终结果,以下内容就足够了:
使用 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 以了解有关您可以计算的输出和更多功能的详细信息。
- 迈克