Это упрощенная версия программы, которая имеет два канала для выполнения какой-либо операции
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;
}
В ней используется один канал для выполнения какой-либо операции (здесь упрощенно для установки случайного элемента на один) и другойдля смешивания элементов, взятых в парах.Он работает и завершается через некоторое время, но для указанных размеров он начинает увеличивать использование памяти, пока не достигнет почти 1 ГБ, прежде чем закончится.
Возможно, это микширующий канал, который растет, но я не вижу его в качестве источника утечки, поскольку он получает один элемент из одного блока, а другой - из другого;на канале может быть несколько оставшихся до окончания, но не так много, чтобы оправдать переполнение памяти.Любая другая идея?Дополнительная проблема заключается в том, что он, кажется, всегда использует один и тот же поток для «обработки», несмотря на то, что было запущено 4 разных потока.Я не знаю, связано это или нет.