Perl Fork线程捕获输出

时间:2012-02-08 12:47:20

标签: multithreading perl fork

我想要Fork 5进程,这些进程将为每个小函数创建100个线程。问题是这个函数生成了许多我想在哈希中捕获的值。我能够使用单个进程并创建100个线程,但我无法分支多个线程。这是我在Perl中进行的,并使用线程CPAN模块。

1 个答案:

答案 0 :(得分:2)

一个不分叉多个线程,一个分叉进程。每个新进程都在其自己的内存空间中运行,并且在一个进程中更改任何变量值不会影响任何其他进程中的这些值。要做你想做的事,你需要进行某种进程间的沟通。

实现此目的的一种简单方法是让每个子进程将其输出写入文件,并让子进程在子进程完成时读取该文件。如果您注意并发问题,甚至可以让所有孩子都写入同一个文件:

sub write_child_output_to_file {
   my ($msg, $file) = @_;
   open my $fh, '>>', $file;
   flock $fh, 2;
   seek $fh, 0, 2;
   print $fh $msg;
   close $fh;
}

Forks::Super模块具有可以为您处理这些详细信息的功能:

use Forks::Super;
use Data::Dumper;
my %foo;
for my $i (1 .. 5) {
    fork {
        share => [ \%foo ],
        sub => {
            # the code that will run in each child process.
            # Updates to the variable  %foo  in the child will be
            # available to the parent when the child finishes
            ...
        }
    };
}
waitall;
print "Data produced in all the children: ",
    Data::Dumper::Dumper(\%foo);