我正在尝试在我的程序中创建子程序的线程(称为重组)。我使用下面的代码来创建线程,我改编自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 取自代码前面的另一个哈希值,我的 $ParentTally=$hashref->{'Tally'}; 所以这部分程序每次循环使用不同的 $ParentTally 值。%Parent1Chromosome & %Parent2Chromosome 是在程序前面创建的。子程序“重组”很长,所以我没有发布它,但它返回一个整数。)
通常在运行程序时(尽管并非总是如此,许多早期的代码都依赖于随机变量,因此程序永远不会运行相同的)一旦它完成我得到'Perl exited with active threads:'number'finished and unjoined'( “数字”因运行而异)。我以为:
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)。谢谢