Blanchette, Marco wrote:
> my @thr;
> for (my $i=0;$i<=$#ARGV;$i++){
>  push @thr, threads->new(\&extractSeq, $ARGV[$i]);
>  if (scalar(@thr) == $opt_p || $i == $#ARGV){
>    print "Running ",scalar(@thr)," parallel jobs\n";
>    $_->join for @thr;
>    undef @thr;
>  }
> }

Your job control is running in batches of $opt_p with
each batch running until all jobs are complete.  This
is inefficient.  Try the following:

foreach my $arg (@ARGV) {
    # New parallel job
    threads->new(\&extractSeq, $arg);

    # If max parallel count, then wait for some threads to finish
    while (threads->list(threads::running) >= $opt_p) {
        if (my @thrs = threads->list(threads::joinable)) {
            $_->join() foreach @thrs;
        } else {
            sleep(1);
        }
    }
}
# Wait for all running threads to finish
$_->join() foreach threads->list();

Reply via email to