use Proc::Queue size => 10; sub whatEver { my $list = shift; my (%pid, %result); foreach my $query (keys %$list) { my $pid = fork; defined $pid or die "fork failed"; if (!$pid) { my $ok = do_whatever(); exit (!$ok); } else { $pid{$query} = $pid; } } for my $query (keys %pid) { if (waitpid($pid{$query}, 0) > 0) { $result{$query} = ! $? } } print Dumper("2", \%result); }