叉在一个循环中。同步过程

时间:2014-06-24 18:14:38

标签: perl loops process

我没有完全理解fork函数。

如何同时打印文件的输出,为每个文件使用单独的过程?

my $regex = $ARGV[0];

for (@ARGV[1 .. $#ARGV]){
        open (my $fh, "<", $_);
        foreach (<$fh>){
               print "$1\n" if $_ =~ /(\b$regex\b)/;
        }
   }

1 个答案:

答案 0 :(得分:1)

据推测,您还希望限制同时进程的数量。 Parallel::ForkManager让这很容易。

use Parallel::ForkManager qw( );

my $pm = Parallel::ForkManager->new($MAX_PROCESSES);

my $filter = shift(@ARGV);
$filter = qr/$filter/;

for my $qfn (@ARGV) {
   $pm->start() and next;

   open(my $fh, '<', $qfn)
      or die("Can't open \"$qfn\": $!\n");

   while (<$fh>) {
      print "$1\n" if /(\b$regex\b)/;
   }
}

$pm->finish();

如果您不想限制同时进程的数量,它看起来会非常相似。

my $filter = shift(@ARGV);
$filter = qr/$filter/;

for my $qfn (@ARGV) {
   fork() and next;

   open(my $fh, '<', $qfn)
      or die("Can't open \"$qfn\": $!\n");

   while (<$fh>) {
      print "$1\n" if /(\b$regex\b)/;
   }
}

1 while wait() > 0;