#pseudo code use Parallel::ForkManager; $threads = 20 my $pfm = new Parallel::ForkManager( $threads ); FOREACH: foreach my $thing(keys %{$things_hr}) { my $pid = $pfm->start and next; #do stuff push @names, $name; #do stuff $thing{$name}{a} = $value1; $thing{$name}{b} = $value2; #do stuff $list{$id}{$name}{b} = $b; $list{$id}{$name}{e} = $b1; $list{$id}{$name}{a} = 0; $list{$id}{$name}{c} = $ar->[$id][3]; $list{$id}{$name}{i} = $ar->[$id][1]; $list{$id}{$name}{j} = $ar->[$id][2]; $list{$id}{$name}{k} = sprintf("%.4f",$ar->[$id][9]); $pfm->finish; $pfm->wait_all_children;