use strict;
use warnings;
use Parallel::ForkManager qw( );
my @data = (
...
);
my @tasks = (
sub { printf("%s\n", $_[0]); },
sub { exec('/home/working/perl1.pl', $_[0]); },
sub { exec('/home/perl2.pl', $_[0]); },
);
{
my $task_id;
my @idle = (0..$#tasks);
my %alloc;
my $pm = Parallel::ForkManager->new(scalar(@tasks));
$pm->run_pre_fork(sub {
$task_id = shift(@idle);
});
$pm->run_on_start(sub {
my ($pid) = @_;
$alloc{$pid} = $task_id;
});
$pm->run_on_finish(sub {
my ($pid) = @_;
push(@idle, delete($alloc{$pid}));
});
foreach my $data (@data) {
my $pid = $pm->start and next;
$tasks[$task_id]->($data);
$pm->finish;
}
}
Changes to site/lib/Parallel/ForkManager.pm:
-
Change
$s->wait_children;
if ($s->{max_proc}) {
my $pid=fork();
in start to
$s->wait_children;
$s->pre_fork;
if ($s->{max_proc}) {
my $pid=fork();
-
Add
sub run_pre_fork { my ($s,$code)=@_;
$s->{pre_fork}=$code;
}
sub pre_fork { my ($s)=@_;
$s->{pre_fork}->() if ref($s->{pre_fork}) eq 'CODE';
}
|