为什么这个fork循环不能按预期工作?

时间:2013-08-28 22:56:10

标签: windows perl multiprocessing fork activestate

为什么以下代码:

#!/usr/bin/perl
use strict;
use warnings;
use Parallel::ForkManager;  

my $pm = new Parallel::ForkManager(5);

my @all_data = ('a','b','c','d','e','f');

foreach my $data (@all_data) {
    # Forks and returns the pid for the child:
    my $pid = $pm->start and next; 
    print "Hello $pid\n";
    $pm->finish; # Terminates the child process
}
$pm->wait_all_children;  

打印:

Hello 0  
Hello 0  
Hello 0  
Hello 0  
Hello 0  

我是Perl的新手,我正试图赶上Perl中的多处理

2 个答案:

答案 0 :(得分:2)

来自docs for the start method

  

此方法执行fork。它返回父进程的子进程的pid,以及子进程的0。

碰巧,fork函数的作用相同,这就是start反映它的原因。

父母可能需要孩子PID来控制孩子 - 发送信号和东西 - 但孩子通过$$变量知道自己的PID:

foreach my $data (@all_data) {
    $pm->start and next; 
    print "Hello $$\n";
    $pm->finish;
}

示例输出:

Hello 22215
Hello 22218
Hello 22219
Hello 22217
Hello 22220
Hello 22216

答案 1 :(得分:-1)

my $ pid = $ pm-> start and next;

如果两个参数都为真,则

“和”逻辑将评估为true。如果第一个参数为false,则“and”逻辑将快捷方式,不会评估第二个参数

您可能希望使用“或”逻辑。