my @slot_in_use = (0, 0); my @slot_names = qw/one two/; sub find_slot () { for (my $i = 0; $i < @slot_in_use; $i++) { unless ($slot_in_use[$i]) { $slot_in_use[$i] = 1; return $i } } die "slot table full"; } $pm->run_on_finish(sub { my ($c_pid, $c_exit, $c_slot) = @_; $slot_in_use[$c_slot] = 0; # release slot }); foreach my $n (@data) { my $slot = find_slot; $pm->start($slot) and next; # ... $pm->finish; }