Multithreading Perl Fork线程捕获输出

Multithreading Perl Fork线程捕获输出,multithreading,perl,fork,Multithreading,Perl,Fork,我想分叉5个进程,它们都会为一个小函数创建100个线程。问题是这个函数正在生成许多我想在散列中捕获的值。我可以用一个进程创建100个线程,但不能用分叉多个线程。这是我在Perl中所做的,并使用threads CPAN模块进行同样的操作。一个线程不会分叉多个线程,一个线程分叉进程。每个新进程在其自己的内存空间中运行,更改一个进程中的任何变量值不会影响任何其他进程中的这些值。要做您想做的事情,您需要某种进程间通信 实现这一点的一个简单方法是让每个子进程将其输出写入一个文件,并在完成子进程时让父进程读

我想分叉5个进程,它们都会为一个小函数创建100个线程。问题是这个函数正在生成许多我想在散列中捕获的值。我可以用一个进程创建100个线程,但不能用分叉多个线程。这是我在Perl中所做的,并使用threads CPAN模块进行同样的操作。

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

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

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;
}
该模块具有可为您处理这些详细信息的功能:

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);

实际上,这个小功能是下载文件。我分叉5个进程,然后每个进程创建100个线程来使用WW::Curl下载文件。我不想使用WWW::Curl::Many模块,但只能这样使用。任何帮助都将不胜感激!