Я пытаюсь создать потоки подпрограммы в моей программе (называется Рекомбинация ). Я использовал приведенный ниже код для создания потоков, которые я адаптировал из http://chicken.genouest.org/perl/multi-threading-with-perl/. Я использовал этот код при создании этих потоков. в цикле, при этом количество потоков зависит от переменной $ParentTally, которая разная для каждого цикла (а $ParentTally может быть до 1000, и я не хотел запускать 1000 потоков одновременно)
my $nb_process = 20;
my $nb_compute = $ParentTally;
my $i=0;
my @running = ();
my @Threads;
my %NewPopulation;
while (scalar @Threads < $nb_compute) {
@running = threads->list(threads::running);
if (scalar @running < $nb_process) {
my $Offspring= threads->new (sub {Recombination(\%Parent1Chromosome, \%Parent2Chromosome)});
push (@Threads, $Offspring);
my $tid = $Offspring->tid;
}
@running = threads->list(threads::running);
foreach my $thr (@Threads) {
if ($thr->is_running()) {
my $tid = $thr->tid;
}
elsif ($thr->is_joinable()) {
my $tid = $thr->tid;
my $Offspring1=$thr->join();
$NewPopulation{$Offspring1}{'Tally'}+=1;
}
}
@running = threads->list(threads::running);
$i++;
}
while (scalar @running != 0) {
foreach my $thr (@Threads) {
if ($thr->is_joinable()){
my $Offspring1=$thr->join();
$NewPopulation{$Offspring1}{'Tally'}+=1;
}
}
@running = threads->list(threads::running);
}
(Примечание: $ParentTally берется из другого хэша ранее в коде, my $ParentTally=$hashref->{'Tally'}; так что эта часть программы каждый раз зацикливается с другим значением $ParentTally. %Parent1Chromosome и %Parent2Chromosome создаются ранее в программе.Подпрограмма «Рекомбинация» довольно длинная, поэтому я ее не публиковал, но она возвращает целое число. )
Часто при запуске программы (хотя и не всегда, большая часть более раннего кода зависит от случайных переменных, поэтому программа никогда не работает одинаково) после ее завершения я получаю «Perl завершен с активными потоками: 'число' завершено и несвязанные» («число» варьируется в зависимости от тиража). Я думал, что:
while (scalar @running != 0) {
foreach my $thr (@Threads) {
if ($thr->is_joinable()){
my $Offspring1=$thr->join();
$NewPopulation{$Offspring1}{'Tally'}+=1;
}
}
будет означать, что все потоки завершатся, прежде чем перейти к следующему разделу кода? Что я делаю неправильно? (Я никогда раньше не использовал нити). Я изучал использование http://www.perlmonks.org/?node_id=735931, но я не совсем понял, как использовать Thread::Queue, и не смог найти учебник (и не понял http://perldoc.perl.org/Thread/Queue.html). Спасибо