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

Zha*_*g18 2 parallel-processing perl time-wait

我有一个使用的脚本Parallel::ForkManager.但是,即使在所有子进程完成后,wait_all_children()进程也需要非常长的时间.我知道的方法是打印一些时间戳(见下文).有谁知道可能导致这种情况的原因(我的机器上有16个CPU内核)?

my $pm = Parallel::ForkManager->new(16);
for my $i (1..16) {
    $pm->start($i) and next;

    ... do something within the child-process ...

    print (scalar localtime), " Process $i completed.\n";
    $pm->finish();
}
print (scalar localtime), " Waiting for some child process to finish.\n"; 
$pm->wait_all_children();
print (scalar localtime), " All processes finished.\n"; 
Run Code Online (Sandbox Code Playgroud)

很明显,我会先得到Waiting for some child process to finish消息,比如说时间戳7:08:35.然后我会得到一个Process i completed消息列表,最后一个消息7:10:30.但是,All Processes finished直到7:16:33(!)我才收到消息.为什么在7:10:30到7:16:33之间有6分钟的延迟?谢谢!

Sin*_*nür 8

我试过这个:

#!/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; 
Run Code Online (Sandbox Code Playgroud)

我有:

[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.

perl 5.10.1在Linux上使用Parallel :: ForkManager版本0.7.5.

因此,我得出结论,无论你遇到什么问题,都会因为你发生的事情而发生

# ... do something within the child-process ...
Run Code Online (Sandbox Code Playgroud)

更新:问题是,您正在打电话Process finished message之前打印finish.请尝试以下版本:

#!/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;
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请参阅并行回调:: ForkManager文档.如果延迟消失,那么您观察到的症状是由于您声称分叉过程在完成之前已完成.