这是程序的简化版本,它具有两个用于执行某些操作的通道
use v6;
my $length = 512;
my Channel $channel-one .= new;
my Channel $to-mix .= new;
my Channel $mixer = $to-mix.Supply.batch( elems => 2).Channel;
my @promises;
for ^4 {
$channel-one.send( 1.rand xx $length );
my $promise = start react whenever $channel-one -> @crew {
my @new-crew = @crew;
@new-crew[@new-crew.elems.rand] = 1;
if ( sum(@new-crew) < $length ) {
say "Emitting in thread ", $*THREAD.id, " Best ", sum(@crew) ;
$to-mix.send( @new-crew );
} else {
say "Found: closing";
$channel-one.close;
say "Closed";
};
}
@promises.push: $promise;
}
my $pairs = start react whenever $mixer -> @pair {
$to-mix.send( @pair.pick ); # To avoid getting it hanged up
my @new-population = crossover-frequencies( @pair[0], @pair[1] );
$channel-one.send( @new-population);
say "Mixing in ", $*THREAD.id;
};
await @promises;
say "Finished";
# Cross over frequencies
sub crossover-frequencies( @frequencies, @frequencies-prime --> Array ) is export {
my @pairs = @frequencies Z @frequencies-prime;
my @new-population = gather {
for @pairs -> @pair {
take @pair.pick;
}
};
return @new-population;
}
它使用一个通道执行某些操作(此处简化为将一个随机元素设置为一个),并使用另一个通道混合成对使用的元素。它可以工作并在一段时间后完成,但是对于指示的大小,它的内存使用量开始增长,直到达到将近1GB为止。
可能是不断增长的混合通道,但我不认为它是泄漏的根源,因为它从一个块中获取一个元素,而从另一个块中获取一个元素;在结束之前,通道上可能还剩下一些,但不足以证明内存占用是合理的。还有其他想法吗? 另一个问题是,尽管已经启动了4个不同的线程,但它似乎总是使用相同的线程进行“处理”。我不知道这是否相关。