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; } }