如何在perl中生成处理多个目录

时间:2015-11-14 12:05:57

标签: perl

我有一组目录在foreach中解析它并将每个目录处理输出写入同一文件。我正在尝试使用这个fork进程方法。但是,它没有正常工作,它逐个写一个foreach目录进程。

请建议如何将单个目录生成的进程写入相同的文件或不同的文件。

#!/usr/bin/perl -w
use strict;
my $totalcount  = "/tmp/count";
my @dirs = qw(List of Dirs);
open(FL, ">", "$totalcount");

foreach my $dir (@dirs) {
    my $pid;
    next if $pid = fork;    
    die "fork failed: $!" unless defined $pid;
    processing here...
    print FL "$count";
    exit;
}

1 while (wait() != -1);

2 个答案:

答案 0 :(得分:2)

您可以将Parallel::ForkManager用于此目的。

# spawn 8 processes at a time
my $parallelForkManager = new Parallel::ForkManager(8);
foreach my $dir (@dirs) {
    $parallelForkManager->start and next;

    # processing here...

    $parallelForkManager->finish;
}
$parallelForkManager->wait_all_children;

如果要从多个进程访问单个文件,可能需要对其进行独占访问控制。

open (FILE, '>>', $path);
flock(FILE, LOCK_EX);
print FILE $data;
close FILE;

但是,flock似乎在不同的操作系统上有所不同。请查找有关flock问题的其他信息来源。

修改

如果要打开每个目录的文件并将其写入for-each:

foreach my $dir (@dirs) {
    $parallelForkManager->start and next;

    # processing here...

    open (FILE, '>', "$dir/$filename");
    print FILE $data;
    close FILE;

    $parallelForkManager->finish;
}

答案 1 :(得分:0)

你有一个如何做的答案,但我建议它实际上并没有多大帮助。当你拥有多个CPU并且能够并行使用它们时,并行性会有所帮助。

然而,对于目录遍历而言,这样做并不是非常有益 - 要么已经缓存了(因此没有必要),或者它不是全部你做的是捶打你的磁盘。