我有一组目录在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);
答案 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并且能够并行使用它们时,并行性会有所帮助。
然而,对于目录遍历而言,这样做并不是非常有益 - 要么已经缓存了(因此没有必要),或者它不是全部你做的是捶打你的磁盘。