3

我有一个使用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"; 

显然,我将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 分钟的延迟?谢谢!

4

1 回答 1

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; 

我有:

[sinan@archardy Src]$ ./y.pl
2010 年 3 月 11 日星期四 17:14:16:流程 3 完成
2010 年 3 月 11 日星期四 17:14:16:等待一些孩子完成
2010 年 3 月 11 日星期四 17:14:18:流程 8 完成
2010 年 3 月 11 日星期四 17:14:18:流程 14 完成
<snip>...</snip>
2010 年 3 月 11 日星期四 17:14:34:过程 12 完成
2010 年 3 月 11 日星期四 17:14:34:所有流程都已完成。

perl 5.10.1在 Linux 上有Parallel::ForkManager版本0.7.5

因此,我得出的结论是,您遇到的任何问题都是由于您在

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

更新:问题是,您在通话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;

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

于 2010-03-11T22:17:36.883 回答