在Perl中访问具有子进程的数组

itz*_*tzy 2 perl fork

假设我有5个文件,名为ae.我想并行处理这些.我以为我可以这样做:

my @ltrs = ('a'..'e');

for my $fnum (0..2) { 
    $pid = fork();
    if ($pid) {
        push(@childs, $pid);
    }
    elsif ($pid == 0) {
        do {
            my $ltr = shift(@ltrs);
            print "Open file $ltr on $fnum\n";
        } until (scalar(@ltrs)==0);
        exit(0);
    }
    else {
        die "Couldn't fork: $!\n";
    }
}

foreach (@childs) {
    waitpid($_, 0);
}
Run Code Online (Sandbox Code Playgroud)

但每个子进程都访问以下所有五个元素@ltrs:

Open file a on 0
Open file b on 0
Open file c on 0
Open file d on 0
Open file e on 0
Open file a on 1
Open file b on 1
Open file c on 1
Open file d on 1
Open file e on 1
Open file a on 2
Open file b on 2
Open file c on 2
Open file d on 2
Open file e on 2
Run Code Online (Sandbox Code Playgroud)

当一个进程shift是数组中的一个元素时,为什么当下一个进程查看数组时该元素仍然存在?我假设在第一个之后shift,接下来的任何进程都会找到一个以数组开头的数组b,但显然我错过了一些东西.

Mor*_*kus 7

数据不在进程间共享.每个进程都有自己的副本.

如果您想共享,那么整个广泛的进程间通信世界对您开放.perldoc页面perlipc告诉你所有相关信息.

如果不需要每个实例的完整进程,那么使用线程是另一种方法.与进程线程可以共享数据不同(尽管它们在Perl中默认不是这样).Perldoc页面perlthrtut是这个特定主题的起点.