并发程序中的内存泄漏,还是仅仅是这样?

时间:2019-02-04 20:59:46

标签: concurrency channel perl6

这是程序的简化版本,它具有两个用于执行某些操作的通道

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个不同的线程,但它似乎总是使用相同的线程进行“处理”。我不知道这是否相关。

0 个答案:

没有答案