How to use fork() in Perl?
In addition to your trouble using fork
, you also seem to have trouble partitioning your @files
array into smaller sets of four files. Maybe something like this:
for (my $i = 0; $i < @files; $i += 4) {
# take a slice of 4 elements from @files
my @files4 = @files[$i .. $i + 3];
# do something with them in a child process
if (fork() == 0) {
... do something with @files4 ...
exit; # <--- this is very important
}
}
# wait for the child processes to finish
wait for 0 .. @files/4;
Use Parallel::ForkManager
use Parallel::ForkManager qw( );
my $pm = Parallel::ForkManager->new(int(@files/4));
for my $file (@files) {
my $pid = $pm->start and next;
... do something with $file ...
$pm->finish; # Terminates the child process
}
Note that this still creates 100 processes, it simply limits it to 25 concurrent.
If you truly want only 25 processes, you can use the following:
use List::Util qw( min );
use Parallel::ForkManager qw( );
my $pm = Parallel::ForkManager->new(0+@files);
while (@files) {
my @batch = @files[0..min(4, $#files)];
my $pid = $pm->start and next;
for my $file (@batch) {
... do something with $file ...
}
$pm->finish; # Terminates the child process
}