use Proc::Queue size=>2, qw(run_back); Proc::Queue::trace(1); my @ARGV = ("file1.fasta","file2.fasta"); for ( @ARGV ) { run_back { eval{ run_code($_) }; print STDERR $0."[$$]: $@\n" if $@; } } 1 while wait != -1; run_code { my $file = shift; #do the rest }