sub fitnessCalculation{ ... } sub mixAndMutate{ ... } my @data = readData(); my @generation = genRandomGeneration( 1000 ); while( 1 ) { $_->score = fitnessCalculation( $_ ) for @generation; @generation = ( sort @generation ) [ 0 .. 200 ]; last if $generation[ 0 ]->score > $targetScore; push @generation, mixAndMutate( @generation ); } report $generation[ 0 ]; #### use threads; use Thread::Queue; sub fitnessCalculation{ ... } sub mixAndMutate{ ... } my $Qwork = new Thread::Queue; my $Qresults = new Thread::Queue; my @workers = map threads->create( \&fitnessCalculation, $Qwork, $Qresults ), 1 .. $noOfCores; my @data = readData(); my @generation = genRandomGeneration( 1000 ); while( 1 ) { $Qwork->enqueue( @generation, (undef) x $noOfCores ); ## Updated. @generation = (); for ( 1 .. $noOfCores ) { push @generation, $_ while $_ = $Qresults->dequeue; } @generation = ( sort @generation ) [ 0 .. 200 ]; last if $generation[ 0 ]->score > $targetScore; push @generation, mixAndMutate( @generation ); } report $generation[ 0 ];