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; } } #### $s->wait_children; if ($s->{max_proc}) { my $pid=fork(); #### $s->wait_children; $s->pre_fork; if ($s->{max_proc}) { my $pid=fork(); #### 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'; }