プログラムでサブルーチンのスレッドを作成しようとしています(組換えと呼ばれます)。以下のコードを使用してスレッドを作成しました。これは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は、プログラムの早い段階で作成されます。サブルーチン'Recombination'は非常に長いため、投稿していませんが、整数を返します。)
多くの場合、プログラムを実行すると(常にではありませんが、以前のコードの多くは確率変数に依存しているため、プログラムが同じように実行されることはありません)、プログラムが終了すると、「Perlはアクティブなスレッドで終了します:」「number」が終了し、結合されていません」( 「数」は実行によって異なります)。私はそれを考えました:
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)。ありがとう