我希望让子进程写入父进程的@array.我已经阅读过关于管道的信息,但我对如何实际实现它非常困惑:
use Parallel::ForkManager;
my @array;
my $pm=new Parallel::ForkManager(3);
for((1..5)){
$pm->start and next;
print "child: ".$_."\n";
push(@array,$_); # what do I do here to put it into the parent's @array????
$pm->finish;
}
$pm->wait_all_children;
print "parent: ".$_."\n" for @array;
Run Code Online (Sandbox Code Playgroud)
如果你想使用管道,那么你需要在生成每个子节点之前创建一对管道,从子节点写入写入管道,并使用IO :: Select从父节点并行读取所有读取节点.你还需要改变你等待孩子的方式,因为ForkManager wait_all_children是阻塞的,这不是很有用.您可以使用run_on_start方法在散列中注册每个进程,并在run_on_finish每个进程终止后删除每个进程,然后在没有剩余进程时终止select循环.
或者,如果孩子们可以将他们的结果实时传递回父母并不重要,那么您可以使用ForkManager通过finish调用将数据传递回父母的能力,这看起来像:
#!perl
use strict;
use warnings;
use Parallel::ForkManager;
# No indirect object notation
my $pm = Parallel::ForkManager->new(3);
my @array;
$pm->run_on_finish(sub {
my $return = $_[5]; # Count 'em.
push @array, @$return;
});
for(1..5) {
$pm->start and next;
print "child: $_\n";
$pm->finish(0, [$_]);
}
$pm->wait_all_children;
print "parent: $_\n" for @array;
Run Code Online (Sandbox Code Playgroud)
这实际上有效.
| 归档时间: |
|
| 查看次数: |
1237 次 |
| 最近记录: |