Perl Parallel::ForkManager wait_all_children()花费的时间过长

Perl Parallel::ForkManager wait_all_children()花费的时间过长,perl,parallel-processing,time-wait,Perl,Parallel Processing,Time Wait,我有一个使用Parallel::ForkManager的脚本。然而,wait_all_children()进程即使在所有子进程完成之后也要花费相当长的时间。我知道的方法是打印出一些时间戳(见下文)。有没有人知道是什么原因造成的(我的机器上有16个CPU核) 显然,我将首先得到等待某个子进程完成的消息,时间戳为,比如说,7:08:35。然后,我将得到一个我完成的过程的列表消息,最后一条消息在7:10:30。但是,直到7:16:33(!)我才收到消息所有进程都已完成。为什么在7:10:30和7:16

我有一个使用
Parallel::ForkManager
的脚本。然而,wait_all_children()进程即使在所有子进程完成之后也要花费相当长的时间。我知道的方法是打印出一些时间戳(见下文)。有没有人知道是什么原因造成的(我的机器上有16个CPU核)

显然,我将首先得到等待某个子进程完成的
消息,时间戳为,比如说,
7:08:35
。然后,我将得到一个我完成的
过程的列表
消息,最后一条消息在
7:10:30
。但是,直到
7:16:33
(!)我才收到消息
所有进程都已完成
。为什么在7:10:30和7:16:33之间有6分钟的延迟?谢谢

我试过这个:

#!/opt/perl/bin/perl

use strict; use warnings;

use Parallel::ForkManager;

my $pm = Parallel::ForkManager->new(16);

for my $i (1..16) {
    $pm->start($i) and next;
    sleep rand 20;
    printf "%s : Process %d completed\n", scalar localtime, $i;
    $pm->finish;
}

printf "%s: Waiting for some child to finish\n", scalar localtime;
$pm->wait_all_children;

printf "%s: All processes finished.\n", scalar localtime; 
我得到:

[sinan@archardy Src]$ ./y.pl Thu Mar 11 17:14:16 2010 : Process 3 completed Thu Mar 11 17:14:16 2010: Waiting for some child to finish Thu Mar 11 17:14:18 2010 : Process 8 completed Thu Mar 11 17:14:18 2010 : Process 14 completed <snip>...</snip> Thu Mar 11 17:14:34 2010 : Process 12 completed Thu Mar 11 17:14:34 2010: All processes finished. 更新:问题是,在调用
finish
之前,您正在打印
processfinished消息。请尝试以下版本:

#!/opt/perl/bin/perl

use strict; use warnings;

use Parallel::ForkManager;

my $pm = Parallel::ForkManager->new(16);
$pm->run_on_finish( sub {
    printf "%s : Process completed: @_\n", scalar localtime
});

for my $i (1..16) {
    $pm->start($i) and next;
    sleep rand 20;
    $pm->finish;
}

printf "%s: Waiting for some child to finish\n", scalar localtime;
$pm->wait_all_children;

printf "%s: All processes finished.\n", scalar localtime;

有关更多信息,请参阅。如果延迟消失,则您观察到的症状是由于您声称分叉进程在完成之前已经完成。

这是您正在运行的代码吗?有一个不那么微妙的语法错误。你是对的,思南。我忘了提到,这种延误并非每次都发生在我身上。只有当我的每个子进程都需要很长时间和很多系统资源才能完成时,才会发生这种情况。然而,让我困扰的是,在打印出最后一个“我完成的过程”之后,孩子们身上发生的任何事情都不再相关。但这里是我得到的实际输出:08:02:43:等待一些孩子。。。08:06:00:第1组完成。。。08:06:12:16组完成。08:07:03:全部完成。我想知道我是否应该明确释放一些阻止等待的内存/资源?@Zhang18使用
run\u on\u finish
回调查看我的更新答案。我明白了。因此,如果我通过run_on_finish()打印时间戳,我将得到您所期望的结果(即,由于等待_的子项,没有额外的等待时间)。然而,我的问题因此变成了,为什么即使在循环中我已经到达了print语句,子进程也不会被fork视为“已完成”?可以肯定的是,我并没有对循环中的任务做任何花哨的事情。这只是一堆算术计算加上一些数据库查询和文件I/O。延迟似乎是由于$pm->finish()方法未能获取子进程的实际完成时间造成的。@Zhang18直到
$pm->finish
返回,子进程才完成。请务必阅读最后一段。
# ... do something within the child-process ...
#!/opt/perl/bin/perl

use strict; use warnings;

use Parallel::ForkManager;

my $pm = Parallel::ForkManager->new(16);
$pm->run_on_finish( sub {
    printf "%s : Process completed: @_\n", scalar localtime
});

for my $i (1..16) {
    $pm->start($i) and next;
    sleep rand 20;
    $pm->finish;
}

printf "%s: Waiting for some child to finish\n", scalar localtime;
$pm->wait_all_children;

printf "%s: All processes finished.\n", scalar localtime;