2

免責事項:現在のハードウェアはそのままなので、しばらくフォークする必要はありませんでした。そのため、次のコードについてアドバイスが必要になる場合があります。以下も簡単な例であり、実際のコードではありません。

my @matched;
my @names = qw/jim john sally/;

foreach my $name (@names) {
   my $pid;
   next if $pid = fork;                                # child birth
   croak "Fork failed: $!" if not defined $pid;        # terminate if child wasn't born

   my $result = `command_to_get_some_list_of_names`;   # sam sue john tyler
   my @list   = split /\s/, $result;

   foreach my $match ( @list ){
      push(@matched,$match) if $name eq $match;        # where want to access parent array
   }

   exit;                                               # child funeral
}

1 while (wait() != -1);                                # wait for children to finish playing

say "Matched: @matched";                               # nothing; not desired, but expected

一致が作成@matchedされ、子に入力されていますが、私が覚えていることからfork、親のコピーを作成します. ファイルシステムに一時ファイルを作成するのがより簡単な方法だと思いますが、外部のものは避けたいと思います。

forkスレッド化のためのネイティブな手段を提供する代替手段はありますか?

4

1 に答える 1

1

Forks::Superオプションを使用すると、shareこれが非常に簡単になります。

use Carp;
use 5.012;
use Forks::Super;
my @matched;
my @names = qw/jim john sally/;

foreach my $name (@names) {
   my $pid = fork {
     share => [ \@matched ],
     sub => sub {
       #croak "Fork failed: $!" if not defined $pid;

       my $result = "sam sue john tyler";             # sam sue john tyler
       my @list   = split /\s/, $result;

       foreach my $match ( @list ){
           push(@matched,$match) if $name eq $match;  # where want to access parent array
       }
     }
   };
}

waitall;                                              # wait for children to finish playing

say "Matched: @matched";                              # nothing; not desired, 

結果:

Matched: john
于 2013-05-25T14:41:45.977 に答える